'
'Class structure:
'
!short:OneDbf class structure:
Class  OneDbf:
~~~~~~~~~~~~~~
Includes the high level maintenance of one workarea, i.e. one database file
and its index files. The information about this file relations is stored
here.

Common use:
~~~~~~~~~~~
The kernel for the Dbf class, for servicing of the database files, can be
used separate but it is no need for such use, when yes so in the following
way:
LOCAL OBJECT Od OF OneDbf INIT
Od:AddField(...) //Ŀ
Od:Picture(..)   // one database field description
Od:When(..)      // these four rows can be repeated
Od:Valid(..)     //
...
Od:AddNtx(...)   //index file definition added
...
Od:Create()      //new database and its index files created
...

Source code is in C_Dbf.prg

!seealso: c_dbf.ngo:Dbf c_color.ngo:Color ob_class.ngo:"Class hierarchy"

!short:~~~~~~~~~~~~~~~~~~~~~~~
!short:create class OneDbf
!short:  export:
!short:  var File       //""
^BOneDbf:File^N: public: character
  Database file name, can be set as full name including the drive and path.

!short:  var Name       //""
^BOneDbf:Name^N: public: character
  Alias database name.

!short:  var Struc      //{}
^BOneDbf:Struc^N: read-only: array
  Database structure (the structure of the fields) is stored here
  Struc:={}
  AAdd( Struc, {cFieldName,cFieldType,nLen,nDec} )
  ...
  Where:
  cFieldName - is the fieldname
  cFieldType - can be "C","M","N","D","L"
  nLen       - field size in number of characters
  nDec       - number of decimal places of type "N", or type "C" size
               extension in 256 multiples (see clipper manuals)
  The structure of the array Struc is the same as the aStruc in clipper
  function DBCREATE().

!short:  var Pict       //{}
^BOneDbf:Pict^N: read-only: array
  Onedimensional paralel array to instvar variable Struc, for storing of the
  picture mask of each filed.

!short:  var PreBlock   //{}
^BOneDbf:PreBlock^N: read-only: array
  Onedimensional paralel array to instvar variable Struc, for storing of the
  prevalid code block (PreBlock) for each field.

!short:  var PostBlock  //{}
^BOneDbf:PostBlock^N: read-only: array
  Onedimensional paralel array to instavr variable Struc, for storing of the
  post valid code block (PostBlock) for each field.

!short:  var Ntx        //{}
^BOneDbf:Ntx^N: read-only: array
  Index file definition in form of:
  Ntx:={}
  AAdd( Ntx, {cMenuName,cFileName,cKey,lUnique,lUserDefined} )
  ...
  Where:
  cMenuName    - menu item name, for enabling the selection of this index
                 file with SET ORDER TO
  cFileName    - is the index file name
  cKey         - is the key expression for this index file
  lUnique      - sets the index to be unique or no
  lUserDefined - sets the index to be user defined when runing the program
                 or no. (its flag is only for internal library use,
                 you can use it only in read-only mode)

!short:  var Rel        //{}
^BOneDbf:Rel^N: read-only: array
  Databese file relations decscription:
  Rel:={}
  AAdd( Rel, {cKey,cAlias,nOrder} )
  ...
  Where:
  cKey   - is the key expression as text string, when databases are
           connected it is SEEK command after this expression executed
  cAlias - is the workarea for SEEK
  nOrder - active index order in active ALIAS workarea

!short:  method New=OneDbfNew                 //o:New() --> self
^BOneDbf:New()^N: public: return self
  The object is filled with default values.

!short:  method Init=OneDbfInit               //o:Init() --> true
^BOneDbf:Init()^N: public: return true
  Returns true, no other action.

!short:  method Create=OneDbfCreate           //o:Create(lContinue) --> true/false
^BOneDbf:Create(lContinue)^N: public: return true/false
  The empty database file is created (if exists it is recreated) with its
  index files. When succesfull returns true.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^UlContinue^N: logical: default is true
   If true, it can be continuing the program even if the files couldn't be
   created. This must be confirmed by the user. This problem may arise in
   the network environment. The databases are opened shared when the
   programmer dont set other way as default.

!short:  method Open=OneDbfOpen               //o:Open(lShared,lContinue,lNew) --> true/false
^BOneDbf:Open(lShared,lContinue,lNew)^N: public: return true/false
  The databese is opened with its index files in the network environment.
  When succesfull returns true.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^UlShared^N: logical: default is true
   Default for shared database files opening in network environment.

  ^UlContinue^N: logical: default is true
   If true, it can be continuing the program even if the files couldn't
   be opened. This must be confirmed by the user.
   This problem may arise in the network environment.

  ^UlNew^N: logical: default is true
   If true the database is opened in the first empty workarea,
   otherwise it is opened in the active workarea.

!short:  method NtxOpen=OneDbfNtxOpen         //o:NtxOpen(lContinue) --> true/false
^BOneDbf:NtxOpen(lContinue)^N: public: return true/false
  The index files of opened database file are opened (as by the command
  NET SET INDEX). When succesfull returns true.

  Parameters descripton:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^UlContinue^N: logical: default is true
   If true, it can be continuing the program even if the files couldn't be
   opened. This must be confirmed by the user.
   This problem may arise in the network environment.

!short:  method ReIndex=OneDbfReIndex         //o:ReIndex(lContinue) --> true/false
^BOneDbf:ReIndex(lContinue)^N: public: return true/false
  The index files to opened database file are created, if exist they are
  recreated (as in ther command NET INDEX ON).
  When succesfull returns true.

  Parameters description:
  ~~~~~~~~~~~~~~~~~~~~~~~
  ^UlContinue^N: logical: default is true
   If true it can be continued in the program even if the required files
   couldn't be created. The continuing in a program must be confirmed by
   the user, this problem may arise in network environment.

!short:  method Pack=OneDbfPack               //o:Pack(lContinue) --> true/false
^BOneDbf:Pack(lContinue)^N: public: return true/false
  The PACK command is performed for this database file in network
  environment. If succesfull it returns true.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^UlContinue^N: logical: default is true
   If true it can be continued in the program even if the required files
   couldn't be created. The continuing in a program must be confirmed
   by the user, this problen may arise in network environment.

!short:  method Zap=OneDbfZap                 //o:Zap(lContinue) --> true/false
^BOneDbf:Zap(lContinue)^N: public: return true/false
  The same as in the Pack but instead of is the ZAP command performed.

!short:  method SetRelation=OneDbfSetRelation //o:SetRelation() --> true
^BOneDbf:SetRelation()^N: public: return true
  If all databases are opened the relations for this database can be build.

!short:  method AddField=OneDbfAddField       //o:AddField(cName,cType,nLen,nDec) --> true
^BOneDbf:AddField(cName,cType,nLen,nDec)^N: public: return true
  When creating the database structure, the next field can be appended
  to the structure.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^UcName^N: character: no default
   database filed name

  ^UcType^N: character: no default
   Field type, can be "C","M","N","D" or "L"

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

  ^UnDec^N: numeric: default is 0
   Number of decimal places for type "N" or adding of length of field type
   "C" in 256 multiples. See original clipper manuals.

!short:  method AddNtx=OneDbfAddNtx           //o:AddNtx(cName,cFile,cKey,lUnique,lUser) --> true
^BOneDbf:AddNtx(cName,cFile,cKey,lUnique,lUser)^N: public: return true
  Index definition for this database is added.

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

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

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

  ^UlUnique^N: logical: default is false
   Sets the index to be "unique".

  ^UlUser^N: logical: default is false
   Sets the index to be user created when running the program.

!short:  method AddRelation=OneDbfAddRelation //o:AddRelation(xKey,cAlias,nOrder) --> true
^BOneDbf:AddRelation(cKey,cAlias,nOrder)^N: public: return true
  One relation definition is appended to this database.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^UcKey^N: character: no default
   The key expression in a form of text string, when connecting the databases
   the SEEK command after this evaluated expression is performed.

  ^UcAlias^N: character: no default
   The alias workarea for seek command.

  ^UnOrder^N: numeric: no default
   The active  index file order in cAlias workarea.

!short:  method Picture=OneDbfPicture         //o:Picture(cPict) --> true
^BOneDbf:Picture(cPict)^N: public: return true
  The last defined database field is appended with the input picture mask.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^UcPict^N: character: no default
   The input picture mask.

!short:  method Range=OneDbfRange             //o:Range(nLo,nHi) --> true
^BOneDbf:Range(nLo,nHi)^N: public: return true
  For last created field is Valid code block created for testing the range
  of edited value.

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

  ^UnHi^N: numeric: no default
   High range limit.

!short:  method When=OneDbfWhen               //o:When(bWhen) --> true
^BOneDbf:When(bWhen)^N: public: return true
  For last created field is When code block created, which is performed
  before entering the field editation. When returns false, the field
  editation is skipped.

!short:  method Valid=OneDbfValid             //o:Valid(bValid) --> true
^BOneDbf:Valid(bValid)^N: public: return true
  For last created field is Valid code block created, which is performed
  when finishing the field editation. When returns false, the field
  editation finishing is supressed (you must continue to correct the value).

!short:  method ChValid=OneDbfChValid         //o:ChValid(bValid) --> true
^BOneDbf:ChValid(bValid)^N: public: return true
  For last created field is Valid code block created, which is performed
  when finishing the field editation AFTER its value change. When returns
  false, the field editation finishing is supressed (you must continue to
  correct the value).

!short:  endclass

