home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 May / VPR9705A.ISO / VPR_DATA / PROGRAM / CBTRIAL / SETUP / DATA.Z / DM1.CPP < prev    next >
C/C++ Source or Header  |  1997-02-14  |  7KB  |  178 lines

  1. //----------------------------------------------------------------------------
  2. //Borland C++Builder
  3. //Copyright (c) 1987, 1997 Borland International Inc. All Rights Reserved.
  4. //----------------------------------------------------------------------------
  5. /*
  6.   This example represents a sampling of the way that you might
  7.   approach trapping a number of database errors.
  8.  
  9.   A complete listing of the database errorcodes is found in the
  10.   IDAPI.h file in the Borland Database Engine.
  11.  
  12.   Database errors are defined by category and code. Here's a sample:
  13.  
  14.   // ERRCAT_INTEGRITY
  15.   // ================
  16.  
  17.   #define ERRCODE_KEYVIOL             1     // Key violation
  18.   #define ERRCODE_MINVALERR           2     // Min val check failed
  19.   #define ERRCODE_MAXVALERR           3     // Max val check failed
  20.   #define ERRCODE_REQDERR             4     // Field value required
  21.   #define ERRCODE_FORIEGNKEYERR       5     // Master record missing
  22.   #define ERRCODE_DETAILRECORDSEXIST  6     // Cannot MODIFY or DELETE this Master record
  23.   #define ERRCODE_MASTERTBLLEVEL      7     // Master Table Level is incorrect
  24.   #define ERRCODE_LOOKUPTABLEERR      8     // Field value out of lookup tbl range
  25.   #define ERRCODE_LOOKUPTBLOPENERR    9     // Lookup Table Open failed
  26.   #define ERRCODE_DETAILTBLOPENERR   10     // 0x0a Detail Table Open failed
  27.   #define ERRCODE_MASTERTBLOPENERR   11     // 0x0b Master Table Open failed
  28.   #define ERRCODE_FIELDISBLANK       12     // 0x0c Field is blank
  29.  
  30.   The constant for the base category is added to these constants to represent
  31.   a unique DBI errorcode;
  32.  
  33.   #define DBIERR_KEYVIOL             (ERRBASE_INTEGRITY + ERRCODE_KEYVIOL)
  34.   #define DBIERR_MINVALERR           (ERRBASE_INTEGRITY + ERRCODE_MINVALERR)
  35.   #define DBIERR_MAXVALERR           (ERRBASE_INTEGRITY + ERRCODE_MAXVALERR)
  36.   #define DBIERR_REQDERR             (ERRBASE_INTEGRITY + ERRCODE_REQDERR)
  37.   #define DBIERR_FORIEGNKEYERR       (ERRBASE_INTEGRITY + ERRCODE_FORIEGNKEYERR)
  38.  
  39.   The ERRBASE_INTEGRITY value is 0x2600 (Hex 2600) or 9728 decimal.
  40.   Thus, for example, the errorcode for keyviol is 9729 for master
  41.   with details is 9734.
  42.  
  43. */
  44. //---------------------------------------------------------------------------
  45. #include <vcl\vcl.h>
  46. #pragma hdrstop
  47.  
  48. #include "DM1.h"
  49. //---------------------------------------------------------------------------
  50. #pragma resource "*.dfm"
  51. TDM *DM;
  52. //---------------------------------------------------------------------------
  53. __fastcall TDM::TDM(TComponent* Owner)
  54.         : TDataModule(Owner)
  55. {
  56. }
  57. //---------------------------------------------------------------------------
  58. void __fastcall TDM::CustomerPostError(TDataSet *DataSet,
  59.       EDatabaseError *E, TDataAction &Action)
  60. {
  61.   if (dynamic_cast<EDBEngineError*>(E) != 0)
  62.   {
  63.      if (dynamic_cast<EDBEngineError*>(E)->Errors[0]->ErrorCode == eKeyViol)
  64.      {
  65.         MessageBox(0, "Unable to post: Duplicate Customer ID.", "Warning" ,MB_OK);
  66.         return;
  67.      }
  68.   }
  69. }
  70. //---------------------------------------------------------------------
  71. void __fastcall TDM::CustomerDeleteError(TDataSet *DataSet,
  72.       EDatabaseError *E, TDataAction &Action)
  73. {
  74.   if (dynamic_cast<EDBEngineError*>(E) != 0)
  75.   {
  76.      if (dynamic_cast<EDBEngineError*>(E)->Errors[0]->ErrorCode == eDetailsExist)
  77.      {
  78.         // The customer record has dependant details in the order tale.
  79.         //
  80.         MessageBox(0, "To delete this record, first delete related orders and items."
  81.                 , "Warning" ,MB_OK);
  82.         return;
  83.      }
  84.   }
  85. }
  86. //---------------------------------------------------------------------
  87. void __fastcall TDM::CustomerCustNoChange(TField *Sender)
  88. {
  89.    // Field level event; This code is a cosmetic'
  90.    // neccessity when you change the key of the
  91.    // CustNo in Customer to prevent unexpected changes
  92.    // in the display of the related 'Orders' and
  93.    // 'Items' grids. These controls are re-enabled in the
  94.    // CustomerAfterPost methods.
  95.    //
  96.    Orders->DisableControls();
  97.    Items->DisableControls();
  98. }
  99. //---------------------------------------------------------------------
  100. void __fastcall TDM::CustomerAfterPost(TDataSet *DataSet)
  101. {
  102.    // See note in CustomerCustNoChange.
  103.    //
  104.    DM->Orders->Refresh();
  105.    DM->Items->Refresh();
  106.    DM->Orders->EnableControls();
  107.    DM->Items->EnableControls();
  108. }
  109. //---------------------------------------------------------------------
  110. void __fastcall TDM::OrdersPostError(TDataSet *DataSet, EDatabaseError *E,
  111.       TDataAction &Action)
  112. {
  113.   int iDBIError;
  114.  
  115.   if (dynamic_cast<EDBEngineError*>(E) != 0)
  116.   {
  117.      iDBIError = dynamic_cast<EDBEngineError*>(E)->Errors[0]->ErrorCode;
  118.  
  119.      switch (iDBIError)
  120.      {
  121.         // The EmpNo field  is defined as being required.
  122.         //
  123.         case eRequiredFieldMissing :
  124.            MessageBox(0, "Please provide an Employee ID.", "Warning" ,MB_OK);
  125.            return;
  126.  
  127.         // The primary key is OrdNo.
  128.         //
  129.         case eKeyViol :
  130.            MessageBox(0, "Unable to post: Duplicate Order Number.",
  131.            "Warning" ,MB_OK);
  132.            return;
  133.      }
  134.   }
  135. }
  136. //---------------------------------------------------------------------
  137. void __fastcall TDM::ItemsPostError(TDataSet *DataSet, EDatabaseError *E,
  138.       TDataAction &Action)
  139. {
  140.    // This error will occur when a part number is specified that
  141.    // is not in the parts table.
  142.    //
  143.    if (dynamic_cast<EDBEngineError*>(E)->Errors[0]->ErrorCode == eForeignKey)
  144.    {
  145.       MessageBox(0, "Part Number is invalid.", "Warning" ,MB_OK);
  146.       return;
  147.    }
  148. }
  149. //---------------------------------------------------------------------
  150. void __fastcall TDM::OrdersDeleteError(TDataSet *DataSet,
  151.       EDatabaseError *E, TDataAction &Action)
  152. {
  153.    if (dynamic_cast<EDBEngineError*>(E) != 0)
  154.    {
  155.       if (dynamic_cast<EDBEngineError*>(E)->Errors[0]->ErrorCode == eDetailsExist)
  156.       {
  157.          if (MessageBox(0, "Delete this order and related items?", "Confirmation",
  158.             MB_YESNO) == IDYES)
  159.          {
  160.             // Delete related records in linked 'items' table.
  161.             //
  162.             while (Items->RecordCount > 0)
  163.             {
  164.                Items->Delete();
  165.             }
  166.             // Finally,delete this record
  167.             //
  168.             Action = daRetry;
  169.          }
  170.          else
  171.          {
  172.             return;
  173.          }
  174.       }
  175.    }
  176. }
  177. //---------------------------------------------------------------------
  178.