/*
 * $Id: rddord.txt,v 1.7 2004/04/21 13:41:25 ckedem Exp $
 */

/*
 * The following parts are Copyright of the individual authors.
 * www - http://www.harbour-project.org
 *
 * Copyright 1999 Luiz Rafael Culik <culik@sl.conex.net>
 *    DB*() documentation
 *    ORD*() documentation
 *    RDD*() documentation
 *
 * See doc/license.txt for licensing terms.
 *
 */


/*  $DOC$
 *  $FUNCNAME$
 *      ORDBAGEXT()
 *  $CATEGORY$
 *      Database
 *  $ONELINER$
 *      Returns the Order Bag extension
 *  $SYNTAX$
 *      ORDBAGEXT() --> cBagExt
 *  $ARGUMENTS$
 *      None
 *  $RETURNS$
 *      <cBagExt> The Rdd extension name.
 *  $DESCRIPTION$
 *      This function return th character name of the RDD extension for
 *      the order bag.This is determined by the active RDD for the selected
 *      work area.
 *
 *      This function replaces the Indexord() function.
 *  $EXAMPLES$
 *      USE Tests NEW VIA "DBFNTX"
 *      ? ORDBAGEXT()      //  Returns .ntx
 *      DBCLOSEAREA()
 *      USE Tests NEW VIA "DBFCDX"
 *      ? ORDBAGEXT()      //  Returns .cdx
 *      DBCLOSEAREA()
 *  $STATUS$
 *      S
 *  $COMPLIANCE$
 *      This function is CA Clipper compliant
 *  $PLATFORMS$
 *      All
 *  $FILES$
 *      Library is rdd
 *  $SEEALSO$
 *      INDEXEXT(),ORDBAGNAME()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      ORDBAGNAME()
 *  $CATEGORY$
 *      Database
 *  $ONELINER$
 *      Returns the Order Bag Name.
 *  $SYNTAX$
 *      ORDBAGNAME(<nOrder> | <cOrderName>) --> cOrderBagName
 *  $ARGUMENTS$
 *     <nOrder> A numeric value representing the Order bag number.
 *
 *     <cOrderName> The character name of the Order Bag.
 *  $RETURNS$
 *      ORDBAGNAME() returns the Order bag name
 *  $DESCRIPTION$
 *      This function returns the name of the order bag for the specified
 *      work area. If <nOrder> is specidied,it will represent the position
 *      in the order list of the target order.If <cOrderName> is specified,
 *      it will represent the name of the target order.In essence,it will
 *      tell the name of the database (if That Rdd is in use) for a given
 *      index name or index order number.If <cOrderName> is not specified
 *      or <nOrder> is 0, the Current active order will be used.
 *  $EXAMPLES$
 *      USE Tests VIA "DBFCDX" NEW
 *      Set index to TESTs
 *      ORDBAGNAME( "TeName" )        // Returns: Customer
 *      ORDBAGNAME( "TeLast" )        // Returns: Customer
 *      ORDBAGNAME( "teZip" )         // Returns: Customer
 *      Set Order to Tag TeName
 *      ? OrderBagName() //Return Custumer
 *  $TESTS$
 *      See Examples
 *  $STATUS$
 *      S
 *  $COMPLIANCE$
 *      This function is Ca-Clipper compliant
 *  $PLATFORMS$
 *      All
 *  $FILES$
 *      Library is rdd
 *  $SEEALSO$
 *      INDEXORD(),ORDBAGEXT(),ALIAS()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      ORDCONDSET()
 *  $CATEGORY$
 *      Database
 *  $ONELINER$
 *      Set the Condition and scope for an order
 *  $SYNTAX$
 *      ORDCONSET([<cForCondition>],
 *        [<bForCondition>],
 *        [<lAll>],
 *        [<bWhileCondition>],
 *        [<bEval>],
 *        [<nInterval>],
 *        [<nStart>],
 *        [<nNext>],
 *        [<nRecord>],
 *        [<lRest>],
 *        [<lDescend>],
 *        [<lAdditive>],
 *        [<lCurrent>],
 *        [<lCustom>],
 *        [<lNoOptimize>])
 *  $ARGUMENTS$
 *      <cForCondition> is a string that specifies the FOR condition for the
 *   order.
 *     <bForCondition> is a code block that defines a FOR condition that
 *   each record within the scope must meet in order to be processed. If
 *   a record does not meet the specified condition,it is ignored and the
 *   next  record is processed.Duplicate keys values are not added to the
 *   index file when a FOR condition is Used.
 *  $RETURNS$
 *
 *  $DESCRIPTION$
 *
 *  $EXAMPLES$
 *
 *  $TESTS$
 *
 *  $STATUS$
 *      S
 *  $COMPLIANCE$
 *      ORDCONDSET() is CA-Clipper compliant
 *  $FILES$
 *      Library is rdd
 *  $SEEALSO$
 *
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      ORDCREATE()
 *  $CATEGORY$
 *      Database
 *  $ONELINER$
 *      Create an Order in an Order Bag
 *  $SYNTAX$
 *      ORDCREATE(<cOrderBagName>,[<cOrderName>], <cExpKey>,
 *      [<bExpKey>], [<lUnique>]) --> NIL
 *  $ARGUMENTS$
 *      <cOrderBagName>  Name of the file that contains one or more Orders.
 *
 *      <cOrderName> Name of the order to be created.
 *
 *      <cExpKey> Key value for order for each record in the current work area
 *
 *      <bExpKey> Code block that evaluates to a key for the order for each
 *      record in the work area.
 *
 *      <lUnique> Toggle the unique status of the index.
 *  $RETURNS$
 *      ORDCREATE() always returns NIL.
 *  $DESCRIPTION$
 *      This function creates an order for the current work area.It is
 *      similar to the DBCREATEINDEX() except that this function allows
 *      different orders based on the RDD in effect.The name of the file
 *      <cOrderBagName> or the name of the order <cOrderName> are technically
 *      both considered to be "optional" except that at least one of two
 *      must exist in order to create the order.
 *
 *      The parameter <cExpKey> is the index key expression;typically in
 *      a .DBF driver,the maximum length of the key is 255 characters.
 *
 *      If <bExpKey> is not specified,then the code block is create by
 *      macro expanding the value of <cExpKey>.
 *
 *      If <lUnique> is not specified,then the current internal setting of
 *      SET UNIQUE ON or OFF will be observed.
 *
 *      The active RDD driver determines the capacity in the order for a
 *      specific order bag.
 *
 *      If the name <cOrderBagName> is found in the order bag can contain
 *      a single order,the the name <cOrderBagName> is erased and a new
 *      order is added to the order list in the current or specified work
 *      area.On the other hand,if it can contain multiples tags and if
 *      <cOrderBagName> does not already exist in the order list,then it is
 *      added.It is does exist,then the <cOrderBagName> replaces the former
 *      name in the order list in the current or specified work area.
 *  $EXAMPLES$
 *      USE TESTS VIA "DBFNDX" NEW
 *      ORDCREATE( "FNAME",, "Tests->fName" )
 *
 *      USE TEsts VIA "DBFCDX" NEW
 *      ORDCREATE( , "lName", "tests->lName" )
 *  $TESTS$
 *      See examples
 *  $STATUS$
 *      S
 *  $COMPLIANCE$
 *      This function is Ca-Clipper compliant
 *  $PLATFORMS$
 *      All
 *  $FILES$
 *      Library is rdd
 *  $SEEALSO$
 *      DBCREATEINDEX(),ORDNAME(),ORDSETFOCUS()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      ORDDESTROY()
 *  $CATEGORY$
 *      Database
 *  $ONELINER$
 *      Remove an Order from an Order Bag
 *  $SYNTAX$
 *      ORDDESTROY(<cOrderName> [, <cOrderBagName> ]) --> NIL
 *  $ARGUMENTS$
 *      <cOrderName> Name of the order to remove
 *
 *      <cOrderBagName> Name of the order bag from which order id to be
 *      removed
 *  $RETURNS$
 *      ORDDESTROY() always returns NIL.
 *  $DESCRIPTION$
 *      This function attempts to remove the order named <cOrderName> from the
 *      file containing the order bag name <cOrderBagName>. If <cOrderBagName>
 *      is not specified,then the name of the file will be based on the value
 *      of the ORDNAME() function.If the extension is not included with the
 *      name of the order file,then the extension will be obtained from the
 *      default extension of the current and active RDD.
 *
 *      The DBFNTX driver do not support multiple order bags;therefore,there
 *      cannot be an order to "destroy" from a bag.This function only works
 *      for those drivers with support multiple orders bags (e.q. DBFCDX
 *      and RDDADS drivers).
 *  $EXAMPLES$
 *      USE Tests VIA "DBFCDX" NEW
 *      ORDdestroy( "lName", "tests" )
 *  $TESTS$
 *      See examples
 *  $STATUS$
 *      S
 *  $COMPLIANCE$
 *      This function is Ca-Clipper compliant
 *  $PLATFORMS$
 *      All
 *  $FILES$
 *      Library is rdd
 *  $SEEALSO$
 *      ORDCREATE()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      ORDFOR()
 *  $CATEGORY$
 *      Database
 *  $ONELINER$
 *      Return the FOR expression of an Order
 *  $SYNTAX$
 *      ORDFOR(<xOrder>[, <cOrderBagName>]) --> cForExp
 *
 *  $ARGUMENTS$
 *      <xOrder>  It the name of the target order,or the numeric position
 *      of the order.
 *
 *      <cOrderBagName> Name of the order bag.
 *  $RETURNS$
 *      ORDFOR() returns a expression containing the FOR condition for
 *      an order.
 *  $DESCRIPTION$
 *      This function returns a character string that is the expression for
 *      the FOR condition for the specified order.The order may be specified
 *      if <xOrder> is the name of the order.However,<xOrder> may be an
 *      numeric which represent the position in the order list of the desired
 *      Order.
 *  $EXAMPLES$
 *      USE Tests NEW via _DBFCDX
 *      INDEX ON  Tests->Id ;
 *         TO  TESTS          ;
 *         FOR Tests->Id > 100
 *
 *      ORDFOR( "Tests" )      // Returns: Tests->Id > 100
 *  $TESTS$
 *      See examples
 *  $STATUS$
 *      S
 *  $COMPLIANCE$
 *      This function is Ca-Clipper compliant with one exception.
 *      If the <xOrder> paramter is not specified or <xOrder> is 0, the current
 *      active order is used.
 *  $PLATFORMS$
 *      All
 *  $FILES$
 *      Library is rdd
 *  $SEEALSO$
 *      ORDKEY(),ORDCREATE(),ORDNAME(),ORDNUMBER()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      ORDKEY()
 *  $CATEGORY$
 *      Database
 *  $ONELINER$
 *      Return the key expression of an Order
 *  $SYNTAX$
 *      ORDKEY(<cOrderName> | <nOrder> [, <cOrderBagName>]) --> cExpKey
 *  $ARGUMENTS$
 *      <xOrder>  It the name of the target order,or the numeric position
 *      of the order.
 *
 *      <cOrderBagName> Name of the order bag.
 *  $RETURNS$
 *      <cExpKey> Returns a character string, cExpKey.
 *  $DESCRIPTION$
 *  $EXAMPLES$
 *      USE Tests NEW via _DBFCDX
 *      INDEX ON  Tests->fName ;
 *         TO  Tests           ;
 *         FOR Tests->fName > "CK"
 *      Index on Tests->Id to TestId
 *
 *      ORDKEY( "Tests" )      // Returns: Tests->fName
 *      Set order to 2
 *      ORDKEY()               // Returns: Tests->Id
 *
 *  $STATUS$
 *      S
 *  $COMPLIANCE$
 *      This function is Ca-Clipper compliant with one exception.
 *      If the <xOrder> paramter is not specified or <xOrder> is 0, the current
 *      active order is used.
 *  $PLATFORMS$
 *      All
 *  $FILES$
 *      Library is rdd
 *  $SEEALSO$
 *      ORDFOR(),ORDNAME(),ORDNUMBER(),ORDKEY()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      INDEXEXT()
 *  $CATEGORY$
 *      Database
 *  $ONELINER$
 *      Returns the file extension of the index module used in an application
 *  $SYNTAX$
 *      INDEXEXT() --> <cExtension>
 *  $ARGUMENTS$
 *      None.
 *  $RETURNS$
 *      <cExtension>   Current driver file extension
 *  $DESCRIPTION$
 *      This function returns a string that tells what indexes are to be used
 *      or will be created in the compiled application.The default value is
 *      ".NTX". This is controled by the particular database driver that is
 *      linked with the application.
 *  $EXAMPLES$
 *      IF INDEXEXT()==".NTX"
 *          ? "Current driver being used is DBFNTX"
 *      Endif
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      This function is Ca-Clipper compliant
 *  $PLATFORMS$
 *      All
 *  $FILES$
 *      Library is rdd
 *  $SEEALSO$
 *      INDEXKEY(),INDEXORD()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      INDEXKEY()
 *  $CATEGORY$
 *      Database
 *  $ONELINER$
 *      Yields the key expression of a specified index file.
 *  $SYNTAX$
 *      INDEXKEY(<nOrder>) --> <cIndexKey>
 *  $ARGUMENTS$
 *      <nOrder>  Index order number
 *  $RETURNS$
 *      <cIndexKey>   The index key
 *  $DESCRIPTION$
 *      This function returns a character string stored in the header of the
 *      index file
 *
 *      The index key is displayed for an index file that is designated by
 *      <nOrder>,its position in the USE...INDEX or SET INDEX TO command in
 *      the currently selected or designated work area.If there is no
 *      corresnponding index key at the specified order position,a NULL
 *      byte will be returned.
 *  $EXAMPLES$
 *      USE TESTS NEW INDEX TEST1
 *      ? INDEXKEY(1)
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      This function is Ca-Clipper compliant
 *  $PLATFORMS$
 *      All
 *  $FILES$
 *      Library is rdd
 *  $SEEALSO$
 *      INDEXORD()
 *  $END$
 */

/*  $DOC$
 *  $FUNCNAME$
 *      INDEXORD()
 *  $CATEGORY$
 *      Database
 *  $ONELINER$
 *      Returns the numeric position of the controlling index.
 *  $SYNTAX$
 *      INDEXORD() --> <nPosition>
 *  $ARGUMENTS$
 *      None.
 *  $RETURNS$
 *      <nPosition>   Ordinal position of a controling index
 *  $DESCRIPTION$
 *      The INDEXORD() function returns the numeric position of the current
 *      controlling index in the selected or designated work area.
 *      A returned value of 0 indicated that no active index is controlling
 *      the database,which therefore is in the natural order.
 *  $EXAMPLES$
 *      USE TESTS NEW INDEX TEST1
 *      IF INDEXORD()>0
 *          ? "Current order is ",INDEXORD()
 *      Endif
 *  $STATUS$
 *      R
 *  $COMPLIANCE$
 *      This function is Ca-Clipper compliant
 *  $PLATFORMS$
 *      All
 *  $FILES$
 *      Library is rdd
 *  $SEEALSO$
 *      INDEXKEY()
 *  $END$
 */
