'
'Class description:
'
!short:Dbf Class structure:
Class Dbf:
~~~~~~~~~~
With help of the class OneDbf this class manipulates with all database files
at time. Each required command is precessed on all defined objects of the
class OneDbf.

Common use:
~~~~~~~~~~~
It is evident from examples Demo1.prg and Demo2.prg, i.e. creation of an
object from class database, defining of database structure, opening of
database, reindex, ...

Source code of Dbf class is in C_Dbf.prg

!seealso: c_onedbf.ngo:OneDbf c_color.ngo:Color ob_class.ngo:"Class hierarchy"

!short:~~~~~~~~~~~~~~~~~~~~
!short:create class Dbf
!short:  export:
!short:  var lNew         //false
^BDbf:New^N: public: logical
  It recieves the value only after the creation of databases by Create()
  method and serves for distinguish if the password is required when the
  program starts or not. When databases are created automaticaly there is
  no need to require the password the databases are empty.

!short:  var Data         //{}
^BDbf:Data^N: read-only: array
 This field stores objects of class OneDbf, related to this object.

!short:  method New=DbfNew                 //o:New() --> self
^BDbf:New()^N: public: return self
  Object is filled with default values.

!short:  method Password=DbfPassword       //o:Password() --> true
^BMenu:Password()^N: public: return true
  The instvar variable New of an object of Dbf class is checked for
  welcoming the supervisor or for require of user name and password.
  This method assigns the visibility of menu according to the user privilege
  level. Privilege levels of users are assigned by supervisor.

!short:  method Init=DbfInit               //o:Init() --> true
^BDbf:Init()^N: public: return true
  Object is initialised.

!short:  method Create=DbfCreate           //o:Create() --> true
^BDbf:Create()^N: public: return true
  All databases and index files are created and opened. The system database
  files ^USystem1.dbf^N, ^USystem2.dbf^N and ^USystem3.dbf^N are created
  and used for internal library functions.
  The description is in Basic knowledges  Database files.

!short:  method Open=DbfOpen               //o:Open() --> true
^BDbf:Open()^N: public: return true
  All required database files and their respective index files are opened.
  If a required database file don't exist, then will be created!
  The opening is done for network environment.

!short:  method ReIndex=DbfReIndex         //o:ReIndex(lContinue) --> true/false
^BDbf:ReIndex(lContinue)^N: public: return true/false
  All database files are reindexed, if succesfully then returns true
  otherwise false.

!short:  method Pack=DbfPack               //o:Pack(lContinue) --> true/false
^BDbf:Pack(lContinue)^N: public: return true/false
  All database files are packed, if succesfully then returns true
  otherwise false.

!short:  method Zap=DbfZap                 //o:Zap(lContinue) --> true/false
^BDbf:Zap(lContinue)^N: public: return true/false
  All database files are zapped, if succesfully then returns true
  otherwise false.

!short:  method AddDbf=DbfAddDbf           //o:AddDbf(cFile) --> true
^BDbf:AddDbf(cFile)^N: public: return true
  New database is added to internal database list. New object of OneDbf class
  is created and added to instvar variable Data.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~~
  ^UcFile^N: character: no default
   It is database file name, stored to instvar variable OneDbf:File, its name
   without the path is stored as alias to instvar variable OneDbf:Name.

!short:  method AddField=DbfAddField       //o:AddField(cName,cType,nLen,nDec) --> true
^BDbf:AddField(cName,cType,nLen,nDec)^N: public: return true
  The last created object OneDbf is appended with next field.

  Parameter desription:
  ~~~~~~~~~~~~~~~~~~~~~~~
  ^UcName^N: character: no default
   new database field name

  ^UcType^N: character: no default
   Database field type, could be "C","M","N","D" or "L


  ^UnLen^N: numeric: default is 10,8 or 1 (after field type)
   Database field size.

  ^UnDec^N: numeric: default is 0
   It is number of decimal digits for "N" type, or adding the width
   of type "C" in multiples of 256. (see the clipper manuals)

!short:  method AddNtx=DbfAddNtx           //o:AddNtx(cName,cFile,cKey,lUnique) --> true
^BDbf:AddNtx(cName,cFile,cKey,lUnique)^N: public: return true
  Last new created object OneDbf is appended with definition of next index
  file.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^UcName^N: character: no default
   Menu item name for selection of this index file (SET ORDER).

  ^UcFile^N: character: no default
   Index file name.

  ^UcKey^N: character: no default
   Key expresion for index file.

  ^UlUnique^N: logical: default is false
   Controls the UNIQUE index keys.

!short:  method AddRelation=DbfAddRelation //o:AddRelation(xKey,cAlias,nOrder) --> true
^BDbf:AddRelation(xKey,cAlias,nOrder)^N: public: return true
  Last created object OneDbf is appended with next relation definition.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^UcKey^N: character: no default
   Key expresion as text string, for making relation is this evaluated
   for SEEK command.

  ^UcAlias^N: character: no default
   Work area selection for SEEK command.

  ^UnOrder^N: numeric: no default
   Order of active index in "cAlias" workarea.

!short:  method Picture=DbfPicture         //o:Picture(cPict) --> true
^BDbf:Picture(cPict)^N: public: return true
  To last created object of class OneDbf is stored the information about
  the display mask of last defined database field.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^UcPict^N: character: no default
   Display mask.

!short:  method Range=DbfRange             //o:Range(nLo,nHi) --> true
^BDbf:Range(nLo,nHi)^N: public: return true
  To last created object of class OneDbf is stored the code block Valid
  to check the validity of database field value range.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~~
  ^UnLo^N: numeric: no default
   Low field value range.

  ^UnHi^N: numeric: no default
   High (upper) field value range.

!short:  method When=DbfWhen               //o:When(bWhen) --> true
^BDbf:When(bWhen)^N: public: return true
  To last created object of OneDbf class is for last defined database field
  stored code block When. This code block is processed for entering this
  database field. If returning false the field editation is skipped.

!short:  method Valid=DbfValid_            //o:Valid(bValid) --> true
^BDbf:Valid(bValid)^N: public: return true
  To last created object of OneDbf class is for last defined database field
  stored code block Valid. This code block is processed after finishig of
  editation of this database field. If returning false the field editation
  can't be finished (incorrect value entered). The code block "bValid", when
  evaluated, will be passed this parameters:
   - currently edited (clipper) Get object.
   - logical value CanEdit (true if editting allowed)
   - old edited value, (it is saved into temporary variable before editting
     of the Get object) 

!short:  method ChValid=DbfChValid         //o:ChValid(bValid) --> true
^BDbf:ChValid(bValid)^N: public: return true
  To last created object of OneDbf class is for last defined database field
  stored code block Valid . This code block is processed after finishig of
  editation of this database field only when the database filed was changed.
  If returning false the field editation  can't be finished. (incorrect
  value entered). The code block "bValid", when
  evaluated, will be passed this parameters:
   - currently edited (clipper) Get object.
   - logical value CanEdit (true if editting allowed)
   - old edited value, (it is saved into temporary variable before editting
     of the Get object)

!short:  method Save=DbfSave               //o:Save(cPath) --> true/false
^BDbf:Save(cPath)^N: public: return true/false
  With help of external utility ARCHIV.exe stores all data files of this
  program to ARCHIV.000 file to desired device. If the desired device
  according of the cPath is the floppy drive and the data files overflowed
  the floppy disk, the utility asks for new disk and the archiving process
  continues with the file name ARCHIV.001 and so on. Data files are all
  files of the current directory with extensions *.dbf, *.dbt, *.ntx.
  If the archiving succeeded it returns true otherwise false.

!short:  method Load=DbfLoad               //o:Load(cPath) --> do_nothing
^BDbf:Load(cPath)^N: public: return false/???
  It is the complement of Dbf:Save() method. It enables to restore all data
  files of the program, stored by Dbf:Save(). If it is not possible to
  restore all files the false is returned. If the restoring succeeded
  it is not possible to continue in program immediately (due to indexes,
  filters and reports) but the program is stopped and the user is asked
  for the restart. After restarting the program the files are reindexed
  and the recovery is succesfully finished.

!short:  method Done=DbfDone               //o:Done() --> true
^BDbf:Done()^N: public: return true
  User is logged out from library file system, all files are closed
  and returns true.

!short:  endclass

