****************************************************************************
----------------------------------------------------------------------------
|                         IMPORTANT - PLEASE READ                          |
----------------------------------------------------------------------------
| Information provided in this document and any software that may          |
| accompany this document (collectively referred to as a DLL Utility) is   |
| provided "as-is" without warranty of any kind, either expressed or       |
| implied, including but not limited to the implied warranties of          |
| merchantability and/or fitness for a particular purpose. The user        |
| assumes the entire risk as to the accuracy and the use of this Utility.  |
|                                                                          |
| This Utility may be copied and distributed subject to the following      |
| conditions: 1) All text must be copied without modification and all      |
| pages must be included; 2) If software is included, all files on the     |
| disk(s) must be copied without modification [the MS-DOS(R) utility       |
| DISKCOPY is appropriate for this purpose]; 3) All components of this     |
| Utility must be distributed together; and 4) This Utility may not be     |
| distributed for profit.                                                  |
|                                                                          |
| Copyright 1993 Microsoft Corporation. All Rights Reserved.               |
| Microsoft and MS-DOS are registered trademarks and Microsoft Access and  |
| Windows are trademarks of Microsoft Corporation.                         |
****************************************************************************

OVERVIEW
--------
   The Microsoft Access Data Definition Language Dynamic Link Library
   (MSADDL10.DLL) provides data definition support beyond that provided by
   standard Microsoft Access.

GOALS
-----
   To enable the Access Basic programmer to create and alter tables, fields, 
   indexes, and relationships, and then use those tables in Microsoft Access
   and Access Basic.

CAUTIONS
--------
   This Utility is provided specifically as an aid to developers who need
   additional data definition information not provided in the Microsoft
   Access retail documentation. As with any DLL, passing an incorrect
   argument type or value could result in General Protection Fault (GPF)
   errors. If this happens, carefully check your arguments. This Utility
   includes an include file (MSADDL10.BAS) that you can use to declare these
   functions. This Utility is not supported by Microsoft; as such, you
   should save your work-in-progress frequently to avoid loss of data. 
****************************************************************************

DESCRIPTION OF THE DATA DEFINITION DDL
--------------------------------------
   The Data Definition interface is a Dynamic Link Library (DLL) you can
   call from Access Basic. Its purpose is to allow Access Basic programmers 
   to programatically manipulate table definitions and data relationships.
   For example, this DLL lets you create tables via Access Basic code.

   (Note: You can use these functions only with Microsoft Access databases
          and tables, and not with any other databases or tables.)

   Table 1 lists the functions provided by MSADDL10.DLL. Each function is
   fully described later in this document.

      Table 1.  MSADDL10.DLL Functions
      ----------------------------------------------------------------------
      Function Name             Purpose
      ------------------------- --------------------------------------------
      AccessDDLStartEngine      Initializes Microsoft Access database engine
      AccessDDLStopEngine       Stops the database engine

      AccessDDLOpenDatabase     Opens a specified Microsoft Access database
      AccessDDLCloseDatabase    Closes the database

      AccessDDLOpenTable        Opens an existing table
      AccessDDLCloseTable       Closes an open table
      AccessDDLCreateTable      Creates a new table
      AccessDDLDeleteTable      Deletes an existing table
      AccessDDLRenameTable      Renames an existing table

      AccessDDLAddField         Adds a new field to a table
      AccessDDLDeleteField      Deletes an existing field
      AccessDDLRenameField      Renames an existing field

      AccessDDLCreateIndex      Creates a new index in an existing table
      AccessDDLDeleteIndex      Deletes an existing index
      AccessDDLRenameIndex      Renames an existing index

      AccessDDLCreateReference  Creates a new relationship between tables
      AccessDDLDeleteReference  Deletes an existing relationship

****************************************************************************

GENERAL DDL PROCEDURE
---------------------
   Before you can create, alter, or delete a table, field, index, or
   relationship, you must first use the AccessDDLStartEngine function to
   initialize the Microsoft Access ISAM database engine. When you are
   finished with all DDL operations, use the AccessDDLStopEngine function.
   The following figure illustrates this general procedure.

      Figure 1.  General DDL Procedure
      ----------------------------------------------------------------------
      
      AccessDDLStartEngine
      AccessDDLOpenDatabase

        AccessDDLOpenTable
        ' Perform field, index, and relationship operations.
        AccessDDLCloseTable

        AccessDDLCreateTable
        ' Perform field, index, and relationship operations.
        AccessDDLCloseTable

      AccessDDLCloseDatabase
      AccessDDLStopEngine

****************************************************************************

OTHER CONSIDERATIONS
--------------------
   The various functions in MSADDL10.DLL don't let you set all of the
   properties normally available in MS Access table design (such as
   Description and Validation Rule). To set or change these properties, you
   must use the regular table design feature of Microsoft Access.

****************************************************************************

FUNCTION DESCRIPTIONS
---------------------
AccessDDLStartEngine Function

      Description  Performs the initialization required to use the Microsoft
                   Access ISAM database engine.

      Syntax       AccessDDLStartEngine(SysDBName, INIFileName, UserName,
                      Password)

      Remarks      The AccessDDLStartEngine function uses the following
                   arguments.

                   Argument       Description
                   -------------- ------------------------------------------
                   SysDBName      String that identifies the path and name
                                  of the system database file; must be a
                                  valid operating system path; this argument 
                                  is ignored when AccessDDLStartEngine is
                                  called from Access Basic, since the path
                                  and name have already been established.
                   INIFileName    String that identifies the path and name
                                  of the INI file; length may not exceed 14
                                  characters; this argument is ignored when
                                  AccessDDLStartEngine is called from Access
                                  Basic, since the path and name have
                                  already been established.
                   UserName       String that is that name of the current
                                  user.
                   Password       String that is the current user's
                                  password.
      
      Returns
      ----------------------------------------------------------------------
      ACCESSDDL_ErrSuccess             Operation was successful.
      ACCESSDDL_ErrAccessDenied        Current user doesn't have required
                                       permissions.
      ACCESSDDL_ErrAlreadyInitialized  AccessDDLStartEngine already called.
      ACCESSDDL_ErrInvalidAccountName  Couldn't find account name.
      ACCESSDDL_ErrInvalidParameter    One or more parameters is invalid or
                                       Null.
      ACCESSDDL_ErrInvalidPassword     Incorrect or invalid password.
      ACCESSDDL_ErrPermissionDenied    Invalid DatabaseID argument.
      ACCESSDDL_ErrTooManyTasks        Too many concurrent DDL instances.

AccessDDLStopEngine Function

      Description  Stops the Microsoft Access ISAM database engine and
                   closes the current session.

      Syntax       AccessDDLStopEngine()

      Remarks      The AccessDDLStopEngine function accepts no arguments.

      Returns
      ----------------------------------------------------------------------
      ACCESSDDL_ErrSuccess             Operation was successful.
      ACCESSDDL_ErrNotInitialized      AccessDDLStartEngine hasn't been
                                       called.

AccessDDLOpenDatabase Function

      Description  Opens an existing Microsoft Access database to allow
                   subsequent DDL operations.

      Syntax       AccessDDLOpenDatabase(DatabaseName, DatabaseID)

      Remarks      The AccessDDLOpenDatabase function uses the following
                   arguments.

                   Argument       Description
                   -------------- ------------------------------------------
                   DatabaseName   String that is name of the database,
                                  including the path.
                   DatabaseID     Long integer returned by the function that
                                  identifies the database.

      Returns
      ----------------------------------------------------------------------
      ACCESSDDL_ErrSuccess             Operation was successful.
      ACCESSDDL_ErrDatabaseInvalidName Invalid database name.
      ACCESSDDL_ErrDatabaseNotFound    Couldn't find specified database.
      ACCESSDDL_ErrFileAccessDenied    Couldn't open the specified database.
      ACCESSDDL_ErrInvalidParameter    One or more parameters is invalid or
                                       Null.
      ACCESSDDL_ErrNotInitialized      AccessDDLStartEngine hasn't been
                                       called.
      ACCESSDDL_ErrPermissionDenied    Database file is read-only.
      ACCESSDDL_ErrTooManyOpenFiles    No MS-DOS file handle available.

      This function may also return various error codes associated with
      resource failure.

AccessDDLCloseDatabase Function

      Description  Closes a database previously opened with the
                   AccessDDLOpenDatabase function.

      Syntax       AccessDDLCloseDatabase(DatabaseID)

      Remarks      The AccessDDLCloseDatabase function uses the following
                   arguments.

                   Argument       Description
                   -------------- ------------------------------------------
                   DatabaseID     Long integer that is the ID of the
                                  database to be closed.

      Returns
      ----------------------------------------------------------------------
      ACCESSDDL_ErrSuccess             Operation was successful.
      ACCESSDDL_ErrDatabaseCloseError  Couldn't close database file.
      ACCESSDDL_ErrDatabaseNotFound    Couldn't find database or database
                                       not open.
      ACCESSDDL_ErrNotInitialized      AccessDDLStartEngine hasn't been
                                       called.

      This function may also return various error codes associated with
      resource failure.

AccessDDLOpenTable Function

      Description  Opens an existing Microsoft Access table to allow
                   subsequent DDL operations.

      Syntax       AccessDDLOpenTable(DatabaseID, TableName, TableID);

      Remarks      The AccessDDLOpenTable function uses the following
                   arguments.

                   Argument       Description
                   -------------- ------------------------------------------
                   DatabaseID     Long integer that identifies the database
                                  that contains the table to be opened.
                   TableName      String that is the name of the table to be
                                  opened.
                   TableID        Long integer returned by the function that
                                  identifies the opened table.

                   AccessDDLOpenTable opens the specified table exclusively.
                   When you are finished with all DDL operations on the
                   table, use the AccessDDLCloseTable function to close the
                   table.

      Returns
      ----------------------------------------------------------------------
      ACCESSDDL_ErrSuccess             Operation was successful.
      ACCESSDDL_ErrFileAccessDenied    Current user doesn't have required
                                       permissions.
      ACCESSDDL_ErrInvalidDatabaseID   No such database or database not
                                       open.
      ACCESSDDL_ErrInvalidName         Invalid table name.
      ACCESSDDL_ErrInvalidParameter    One or more parameters is invalid or
                                       Null.
      ACCESSDDL_ErrNotInitialized      AccessDDLStartEngine hasn't been
                                       called.
      ACCESSDDL_ErrObjectNotFound      Couldn't find specified table.
      ACCESSDDL_ErrTableInUse          Couldn't open table exclusively.
      
      This function may also return various error codes associated with
      resource failure.

AccessDDLCloseTable Function

      Description  Closes a table previously opened with the
                   AccessDDLOpenTable or AccessDDLCreateTable functions.

      Syntax       AccessDDLCloseTable(TableID)

      Remarks      The AccessDDLCloseTable function uses the following
                   arguments.

                   Argument       Description
                   -------------- ------------------------------------------
                   TableID        Long integer that identifies the table to
                                  be closed; this is the value returned by
                                  AccessDDLOpenTable when the table was
                                  opened.

                   Once closed, the table's TableID will be invalid.
      
      Returns
      ----------------------------------------------------------------------
      ACCESSDDL_ErrSuccess             Operation was successful.
      ACCESSDDL_ErrInvalidTableID      Invalid TableID.
      ACCESSDDL_ErrNotInitialized      AccessDDLStartEngine hasn't been
                                       called.

AccessDDLCreateTable Function

      Description  Creates a new table in the specified database.

      Syntax       AccessDDLCreateTable(DatabaseID, TableName, TableID)

      Remarks      The AccessDDLCreateTable function uses the following
                   arguments.

                   Argument       Description
                   -------------- ------------------------------------------
                   DatabaseID     Long integer that identifies the database
                                  in which the new table will be created.
                   TableName      String that is the name of the table to be
                                  created; may not exceed 64 characters.
                   TableID        Long integer returned by the function that
                                  identifies the exclusively opened table.

                   The new table will be opened exclusively.
                   
                   The table will have no fields and no indexes. Use the
                   AccessDDLAddField function to add fields and
                   AccessDDLCreateIndex to add indexes. It is inadvisable
                   to create a table without also defining fields for that
                   table.

                   You must use the AccessDDLCloseTable function
                   to close the table when you are finished with it.

      Returns
      ----------------------------------------------------------------------
      ACCESSDDL_ErrSuccess             Operation was successful.
      ACCESSDDL_ErrAccessDenied        Current user doesn't have required
                                       permissions.
      ACCESSDDL_ErrInvalidDatabaseID   Invalid DatabaseID argument.
      ACCESSDDL_ErrInvalidName         Invalid table name.
      ACCESSDDL_ErrInvalidParameter    One or more parameters is invalid or
                                       Null.
      ACCESSDDL_ErrNotInitialized      AccessDDLStartEngine hasn't been
                                       called.
      ACCESSDDL_ErrTableDuplicate      Table already exists.
      
      This function may also return various error codes associated with
      resource failure.

AccessDDLDeleteTable Function

      Description  Deletes a specified table, its data, and any indexes.

      Syntax       AccessDDLDeleteTable(DatabaseID, TableName)

      Remarks      The AccessDDLDeleteTable function uses the following
                   arguments.

                   Argument       Description
                   -------------- ------------------------------------------
                   DatabaseID     Long integer that identifies the database
                                  that contains the table.
                   TableName      String that is the name of the table to be
                                  deleted; may not exceed 64 characters.

                   The table must not be open by any user, including the
                   current user.

                   The current user must have Modify Definitions permission
                   for the specified table.

                   Once deleted, all queries, forms, reports, or code that
                   reference the table will be invalid.

      IMPORTANT    When you use AccessDDLDeleteTable to delete a table that
                   was created or modified in MS Access table design (as
                   opposed to created or modified using MSADDL10.DLL), MS
                   Access maintains internal information about the table
                   which will remain in the database until the database is
                   compacted. Until this information is discarded, you will
                   encounter unpredictable results if you use the
                   AccessDDLCreateTable function to create another table
                   with the same name, or use the AccessDDLRenameTable
                   function to rename an existing table to the same name
                   without first compacting the database.

      Returns
      ----------------------------------------------------------------------
      ACCESSDDL_ErrSuccess             Operation was successful.
      ACCESSDDL_ErrAccessDenied        Current user doesn't have required
                                       permissions.
      ACCESSDDL_ErrIndexInUse          Table contains an index that exists
                                       in a reference (relationship) and
                                       can't be deleted.
      ACCESSDDL_ErrInvalidDatabaseID   Invalid DatabaseID argument.
      ACCESSDDL_ErrInvalidName         Invalid table name.
      ACCESSDDL_ErrInvalidParameter    One or more parameters is invalid or
                                       Null.
      ACCESSDDL_ErrNotInitialized      AccessDDLStartEngine hasn't been
                                       called.
      ACCESSDDL_ErrObjectNotFound      No such table.
      ACCESSDDL_ErrTableInUse          Table is in use by another user.

AccessDDLRenameTable Function

      Description  Renames a specified table.

      Syntax       AccessDDLRenameTable(DatabaseID, OldTableName,
                     NewTableName)

      Remarks      The AccessDDLRenameTable function uses the following
                   arguments.

                   Argument       Description
                   -------------- ------------------------------------------
                   DatabaseID     Long integer that identifies the database
                                  that contains the table.
                   OldTableName   String that is the table to be renamed;
                                  may not exceed 64 characters.
                   NewTableName   String that is the new table name; may not
                                  exceed 64 characters.

                   You can freely rename tables created with MSADDL10.DLL;
                   however, when you rename a table that was created in MS
                   Access table design (as opposed to created using the DLL),
                   Access will maintain outdated internal information about the
                   old table name which will remain in the database until the
                   database is compacted. Until this information is discarded,
                   you will encounter unpredictable results if you use the
                   AccessDDLCreateTable or AccessDDLRenameTable functions to
                   create or rename another table with the old table name.
                   Also note that any properties defined in table design will 
                   be lost if the table is renamed using AcccessDDLRenameTable.

                   The table must be closed in order to be renamed.

                   Once renamed, all queries, forms, reports, or code that
                   reference the old table name will be invalid.

                   The current user must have Modify Definitions permission
                   for the table.

      Returns
      ----------------------------------------------------------------------
      ACCESSDDL_ErrSuccess             Operation was successful.
      ACCESSDDL_ErrAccessDenied        Current user doesn't have required
                                       permissions.
      ACCESSDDL_ErrInvalidDatabaseID   Invalid DatabaseID argument.
      ACCESSDDL_ErrInvalidName         Invalid table name.
      ACCESSDDL_ErrInvalidParameter    One or more parameters is invalid or
                                       Null.
      ACCESSDDL_ErrNotInitialized      AccessDDLStartEngine hasn't been
                                       called.
      ACCESSDDL_ErrObjectNotFound      Couldn't find specified table.
      ACCESSDDL_ErrTableDuplicate      New table name already exists.
      ACCESSDDL_ErrTableInUse          Table is in use by another user.

AccessDDLAddField Function

      Description  Adds a new field to a specified table.  

      Syntax       AccessDDLAddField(DatabaseID, TableID, FieldName,
                      FieldType, Max, AutoIncr)

      Remarks      The AccessDDLAddField function uses the following
                   arguments.

                   Argument       Description
                   -------------- ------------------------------------------
                   DatabaseID     Long integer that identifies the database
                                  that contains the table to which the new
                                  field will be added.
                   TableId        Long integer that identifies the table;
                                  this is the value returned by
                                  AccessDDLOpenTable when the table was
                                  opened.
                   FieldName      String that is the name of the new field;
                                  may not exceed 64 characters.
                   FieldType      Integer that identifies the field type;
                                  valid FieldType values are:

                                  ACCESSDDL_FIELDTYPEYESNO       yes/no
                                  ACCESSDDL_FIELDTYPEBYTE        byte
                                  ACCESSDDL_FIELDTYPEINTEGER     integer
                                  ACCESSDDL_FIELDTYPELONGINTEGER long integer
                                  ACCESSDDL_FIELDTYPECURRENCY    currency
                                  ACCESSDDL_FIELDTYPESINGLE      single
                                  ACCESSDDL_FIELDTYPEDOUBLE      double
                                  ACCESSDDL_FIELDTYPEDATETIME    date/time
                                  ACCESSDDL_FIELDTYPETEXT        text
                                  ACCESSDDL_FIELDTYPEOLE         OLE object
                                  ACCESSDDL_FIELDTYPEMEMO        memo
                   Max            Long integer that is the maximum length of
                                  a text field.
                   AutoIncr       Integer that specifies whether the
                                  field is an autoincrement field; valid
                                  AutoIncr values are:

                                    -1  A unique ascending sequence
                                        number will be automatically
                                        assigned to the field when a new
                                        record is added to the table.
                                        FieldType must be a long integer.
                                     0  No such number will be assigned.

                   If FieldType identifies a numeric field type, the field's
                   width will be fixed. All other field types will render a
                   variable-width field.

                   The current user must have Modify Definitions permission
                   for the table.

                   Tables can each contain up to 256 fields.

      Returns
      ----------------------------------------------------------------------
      ACCESSDDL_ErrSuccess             Operation was successful.
      ACCESSDDL_ErrAccessDenied        Current user doesn't have required
                                       permissions.
      ACCESSDDL_ErrField2ndSysMaint    More than one autoincrement field
                                       has been defined.
      ACCESSDDL_ErrFieldDuplicate      Field definition already exists.
      ACCESSDDL_ErrFieldTooBig         Text field width exceeds 255
                                       characters.
      ACCESSDDL_ErrInvalidFieldType    Invalid FieldType argument.
      ACCESSDDL_ErrInvalidDatabaseID   Invalid DatabaseID argument.
      ACCESSDDL_ErrInvalidName         Invalid FieldName argument.
      ACCESSDDL_ErrInvalidParameter    One or more parameters is invalid or
                                       Null.
      ACCESSDDL_ErrInvalidTableID      Invalid TableID argument.
      ACCESSDDL_ErrNotInitialized      AccessDDLStartEngine hasn't been
                                       called.
      ACCESSDDL_ErrTooManyFields       More than 256 fields defined.

AccessDDLDeleteField Function

      Description  Deletes a specified field from a specified
                   table.

      Syntax       AccessDDLDeleteField(TableID, FieldName)

      Remarks      The AccessDDLDeleteField function uses the following
                   arguments.

                   Argument       Description
                   -------------- ------------------------------------------
                   TableID        Long integer that identifies the
                                  exclusively opened table; this is the
                                  value returned by AccessDDLOpenTable when
                                  the table was opened.
                   FieldName      String that is the name of the field to
                                  be deleted; may not exceed 64 characters.

                   You can't delete a field if the table contains an index
                   based on that field. To delete the field, you must first
                   use the AccessDDLDeleteIndex function to delete the
                   index.

                   You also can't delete a field if there is a relationship 
                   based on that field.  To delete the field, the relationship
                   must first be deleted using AccessDDLDeleteReference.

                   The current user must have both Modify Definitions and
                   Read Data permissions for the table. 

                   If the field width is fixed (for example, a text field),
                   the space for the field in existing records won't always
                   be recovered. New records will contain space for the
                   deleted field.

                   If the field width is variable (for example, a memo
                   field), any data in existing records is not deleted and
                   no space is recovered. New records will contain a single
                   byte for the deleted field.

                   To recover the space deleted by AccessDDLDeleteField,
                   compact the database.

                   Once deleted, all queries, forms, reports, or code that
                   reference the deleted field will be invalid.
      
      Returns
      ----------------------------------------------------------------------
      ACCESSDDL_ErrSuccess             Operation was successful.
      ACCESSDDL_ErrAccessDenied        Current user doesn't have required
                                       permissions.
      ACCESSDDL_ErrFieldIndexed        Can't delete field because index
                                       using this field exists.
      ACCESSDDL_ErrFieldNotFound       Couldn't find specified field.
      ACCESSDDL_ErrInvalidName         Invalid field name.
      ACCESSDDL_ErrInvalidParameter    One or more parameters is invalid or
                                       Null.
      ACCESSDDL_ErrInvalidTableID      Invalid TableID argument.
      ACCESSDDL_ErrNotInitialized      AccessDDLStartEngine hasn't been
                                       called.

AccessDDLRenameField Function

      Description  Renames a specified field.

      Syntax       AccessDDLRenameField(TableID, OldFieldName, NewFieldName)

      Remarks      The AccessDDLRenameField function uses the following
                   arguments.

                   Argument       Description
                   -------------- ------------------------------------------
                   TableID        Long integer that identifies the table
                                  that contains the field to be renamed;
                                  this is the value returned by
                                  AccessDDLOpenTable when the table was
                                  opened.
                   OldFieldName   String that is the name of an existing
                                  field; may not exceed 64 characters.
                   NewFieldName   String that is the new name; may not
                                  exceed 64 characters.

                   Once renamed, all queries, forms, reports, or code that
                   reference the old field name will be invalid.

                   If you rename a field that was created in table design
                   (as opposed to created using MSADDL10.DLL), the field
                   will lose all of its existing properties. You should
                   then set the various properties in table design.

      Returns
      ----------------------------------------------------------------------
      ACCESSDDL_ErrSuccess             Operation was successful.
      ACCESSDDL_ErrAccessDenied        Current user doesn't have required
                                       permissions.
      ACCESSDDL_ErrFieldNotFound       Couldn't find the specified field.
      ACCESSDDL_ErrFieldDuplicate      Field name already exists.
      ACCESSDDL_ErrInvalidName         Invalid field name.
      ACCESSDDL_ErrInvalidParameter    One or more parameters is invalid or
                                       Null.
      ACCESSDDL_ErrInvalidTableID      Invalid TableID argument.
      ACCESSDDL_ErrNotInitialized      AccessDDLStartEngine hasn't been
                                       called.

AccessDDLCreateIndex Function

      Description  Defines and creates an index in a specified table.

      Syntax       AccessDDLCreateIndex(TableID, IndexName, IndexFlag, Key)

      Remarks      The AccessDDLCreateIndex function uses the following
                   arguments.

                   Argument       Description
                   -------------- ------------------------------------------
                   TableID        Long integer that identifies the table for
                                  which a new index will be created; this is
                                  the value returned by AccessDDLOpenTable
                                  when the table was opened.
                   IndexName      String that is the name of the index; may 
                                  not exceed 64 characters.

                                  Primary Key
                                  -----------
                                  If you are defining the primary key (see
                                  description for the IndexFlag argument,
                                  below), the IndexName must be the string
                                  "PrimaryKey".

                                  Single-Field Index
                                  ------------------
                                  The IndexName is the same as the name of
                                  the field.

                                  Multiple-Field Index
                                  --------------------
                                  The IndexName is one of "Index1",
                                  "Index2", and so on, through "Index5".
                   IndexFlag      Long integer as follows:
                                    ACCESSDDL_BitIndexPrimary
                                      If this is to be the primary index.
                                    ACCESSDDL_BitIndexUnique
                                      If duplicate index entries are to be
                                      disallowed.
                   Key            String that is a list of field names, in
                                  order of key significance, delimited with
                                  an exclamation point ("!"); may not exceed
                                  255 characters, nor contain more than 10
                                  field names.

                   The current user must have both Modify Definitions and
                   Read Data permissions for the table. 

                   The new index cannot include a Memo field, an OLE object
                   field, or a Yes/No field.

                   Indexes exceeding the maximum length will be truncated.

      Returns
      ----------------------------------------------------------------------
      ACCESSDDL_ErrSuccess             Operation was successful.
      ACCESSDDL_ErrAccessDenied        Current user doesn't have required
                                       permissions.
      ACCESSDDL_ErrFieldCannotIndex    At least one of the specified fields
                                       in Key is a Memo or OLE object field.
      ACCESSDDL_ErrFieldNotFound       Couldn't find specified field name.
      ACCESSDDL_ErrIndexDuplicate      Index already exists.
      ACCESSDDL_ErrIndexHasPrimary     Primary index already exists.
      ACCESSDDL_ErrInvalidName         Invalid index or field name.
      ACCESSDDL_ErrInvalidParameter    One or more parameters is invalid or
                                       Null.
      ACCESSDDL_ErrInvalidTableID      Invalid TableID argument.
      ACCESSDDL_ErrNotInitialized      AccessDDLStartEngine hasn't been
                                       called.
      ACCESSDDL_ErrTooManyKeys         Too many fields in Key.

AccessDDLDeleteIndex Function

      Description  Deletes a specified index.

      Syntax       AccessDDLDeleteIndex(TableID, IndexName)

      Remarks      The AccessDDLDeleteIndex function uses the following
                   arguments.

                   Argument       Description
                   -------------- ------------------------------------------
                   TableID        Long integer that identifies the table
                                  that contains the index to be deleted;
                                  this is the value returned by
                                  AccessDDLOpenTable when the table was
                                  opened.
                   IndexName      String that is the name of the index; may
                                  not exceed 64 characters.

                   Once deleted, all code that references the deleted index
                   will be invalid. You cannot delete an index if it is on
                   the primary (referenced) side of a relationship.

                   The current user must have Modify Definitions permission
                   for the table.

      Returns
      ----------------------------------------------------------------------
      ACCESSDDL_ErrSuccess             Operation was successful.
      ACCESSDDL_ErrAccessDenied        Current user doesn't have required
                                       permissions.
      ACCESSDDL_ErrIndexInUse          Specified index exists in a reference
                                       (relationship) and can't be deleted.
      ACCESSDDL_ErrIndexNotFound       Couldn't find specified index.
      ACCESSDDL_ErrInvalidName         Invalid index name.
      ACCESSDDL_ErrInvalidParameter    One or more parameters is invalid or
                                       Null.
      ACCESSDDL_ErrInvalidTableID      Invalid TableID argument.
      ACCESSDDL_ErrNotInitialized      AccessDDLStartEngine hasn't been
                                       called.

AccessDDLRenameIndex

      Description  Renames a specified index.

      Syntax       AccessDDLRenameIndex(TableID, Index, IndexNew)

      Remarks      The AccessDDLRenameIndex function uses the following
                   arguments.

                   Argument       Description
                   -------------- ------------------------------------------
                   TableID        Long integer that identifies the
                                  exclusively opened table; this is the
                                  value returned by AccessDDLOpenTable when
                                  the table was opened.
                   OldIndexName   String that is the existing name of
                                  the index; may not exceed 64 characters.
                   NewIndexName   String that is the new index name; may not
                                  exceed 64 characters.

                   Once you rename an index, all code that references the
                   old index name will be invalid.

                   The current user must have Modify Definitions permission
                   for the table.

      Returns
      ----------------------------------------------------------------------
      ACCESSDDL_ErrSuccess             Operation was successful.
      ACCESSDDL_ErrAccessDenied        Current user doesn't have required
                                       permissions.
      ACCESSDDL_ErrIndexDuplicate      Index already exists.
      ACCESSDDL_ErrIndexNotFound       No such index.
      ACCESSDDL_ErrInvalidName         Invalid index name specified.
      ACCESSDDL_ErrInvalidParameter    One or more parameters is invalid or
                                       Null.
      ACCESSDDL_ErrInvalidTableID      Invalid TableID argument.
      ACCESSDDL_ErrNotInitialized      AccessDDLStartEngine hasn't been
                                       called.

AccessDDLCreateReference Function

      Description  Creates a relationship between two specified tables.
                   Please note:  the referenced table is the primary table 
                   (the "one" side of a one-to-many relationship or either
                   table in a one-to-one relationship).  The referencing
                   table is the related table (the "many" side of a one-to-
                   many relationship).

      Syntax       AccessDDLCreateReference(TableID, ReferenceName, Fields, 
                      ReferencedTable, ReferencedFields, MatchFlag)

      Remarks      The AccessDDLCreateReference function uses the following
                   arguments.

                   Argument           Description
                   ------------------ --------------------------------------
                   TableID            Long integer that identifies the
                                      referencing table; this is the value
                                      returned by AccessDDLOpenTable when
                                      the table was opened.
                   ReferenceName      String that is the name of the
                                      reference.
                   Fields             String that is a list of field names
                                      delimited with an exclamation point
                                      ("!"); the data types of the
                                      referencing fields must match those
                                      of the referenced fields.
                   ReferencedTable    String that is the name of the
                                      referenced table; this table will be
                                      opened exclusively to ensure that the
                                      reference definition is seen by other
                                      sessions; the referenced table may be
                                      the same as the referencing table.
                   ReferencedFields   A string that is a list of field
                                      names delimited with an exclamation
                                      point ("!"); if this argument is Null,
                                      the fields that comprise the
                                      referenced table's primary index are
                                      used; if this argument is non-Null,
                                      the fields must match the order of
                                      the definition of an existing unique
                                      index on the reference table with
                                      attributes that are compatible with
                                      the match type specified by the
                                      MatchFlag argument; the correspondence
                                      between referencing and referenced
                                      fields is by position within the
                                      field list (when specified) or
                                      position within the primary index
                                      definition (when not specified).
                   MatchFlag          Long integer that specifies the match
                                      type and referential triggered
                                      actions; valid MatchFlag values are:

                                        ACCESSDDL_ReferenceUnique
                                          Identifies the relationship as
                                          one to one; if an index is
                                          created, the index will have
                                          the unique attribute.
                                        ACCESSDDL_ReferenceDontEnforce
                                          Allows users to define
                                          relationships that are not
                                          enforced.

                   You cannot create a relationship with the same
                   referenced table, referenced fields, referencing table,
                   and referencing fields.

                   If the referencing table already has a unique index on
                   the referencing fields, then a unique reference is
                   created, even if the MatchFlag argument is not set to
                   ACCESSDDL_ReferenceUnique.

                   You cannot create a relationship on Memo or OLE object
                   fields.

                   The current user must have Modify Definitions permission
                   for both the referencing and referenced tables.

      Returns
      ----------------------------------------------------------------------
      ACCESSDDL_ErrSuccess             Operation was successful.
      ACCESSDDL_ErrAccessDenied        Current user doesn't have required
                                       permissions.
      ACCESSDDL_ErrFieldCannotIndex    At least one of the specified fields
                                       is a Memo or OLE object field.
      ACCESSDDL_ErrFieldNotFound       Couldn't find specified field name. 
      ACCESSDDL_ErrIndexDuplicate      Specified reference already exists.
      ACCESSDDL_ErrIndexNotFound       Foreign key doesn't match primary
                                       key.
      ACCESSDDL_ErrInvalidName         Invalid referenced table name.
      ACCESSDDL_ErrInvalidParameter    One or more parameters is invalid or
                                       Null.
      ACCESSDDL_ErrInvalidParameter    Number of fields in foreign key
                                       doesn't match number of fields in
                                       primary key.
      ACCESSDDL_ErrInvalidTableID      Invalid TableID argument.
      ACCESSDDL_ErrLinkNotSupported    Can't create reference on attached
                                       table.
      ACCESSDDL_ErrNotInitialized      AccessDDLStartEngine hasn't been
                                       called.
      ACCESSDDL_ErrObjectNotFound      Table name can't be an empty string.
      ACCESSDDL_ErrSelfReference       Can't refer to same field when the
                                       referenced and reference tables are
                                       the same.
      ACCESSDDL_ErrTableInUse          Table is in use by another user.
      ACCESSDDL_ErrTooManyKeys         Too many referenced fields specified
                                       or too many fields specified in key.

AccessDDLDeleteReference Function

      Description  Deletes relationships between two specified tables.

      Syntax       AccessDDLDeleteReference(TableID, ReferenceName)

      Remarks      The AccessDDLDeleteReference function uses the following
                   arguments.

                   Argument       Description
                   -------------- ------------------------------------------
                   TableID        Number that identifies the exclusively
                                  open referencing table; this is the value
                                  returned by AccessDDLOpenTable when the
                                  table was opened.
                   ReferenceName  String that is the name of the reference
                                  you want to delete.

      Returns      
      ----------------------------------------------------------------------
      ACCESSDDL_ErrSuccess             Operation was successful.
      ACCESSDDL_ErrAccessDenied        Current user doesn't have required
                                       permissions.
      ACCESSDDL_ErrIndexNotFound       Specified index couldn't be found.
      ACCESSDDL_ErrInvalidParameter    One or more parameters is invalid or
                                       Null.
      ACCESSDDL_ErrNotInitialized      AccessDDLStartEngine hasn't been
                                       called.

<end of file>
