home *** CD-ROM | disk | FTP | other *** search
/ Total C++ 2 / TOTALCTWO.iso / borland / 32snipit.pak / LNKCRSR.C < prev    next >
C/C++ Source or Header  |  1997-05-06  |  5KB  |  136 lines

  1. // BDE32 3.x - (C) Copyright 1996 by Borland International
  2.  
  3. // LnkCrsr.c
  4. #include "snipit.h"
  5.  
  6. static const char szMasterTable[] = "customer";
  7. static const char szDetailTable[] = "orders";
  8. static const char szTblType[] = szPARADOX;
  9.  
  10. //=====================================================================
  11. //  Function:
  12. //          LnkCrsr();
  13. //
  14. //  Description:
  15. //          Linking cursors establishes a link between two cursors
  16. //          such that the detail cursor has its record set limited to
  17. //          the set of records matching the linking key values of the
  18. //          master cursor.
  19. //=====================================================================
  20. void
  21. LnkCrsr (void)
  22. {
  23.     hDBIDb      hDb = 0;            // Handle to the database
  24.     hDBICur     hCurMaster = 0;     // Handle to the master table
  25.     hDBICur     hCurDetail = 0;     // Handle to the detail table
  26.     DBIResult   rslt;               // Return value from IDAPI functions
  27.     UINT32      ulNumRecs = 10;     // Number of records to display,
  28.                                     //   0 = all
  29.  
  30.     UINT16 uFieldsMaster[] = {1};   // Link the first field of Customer
  31.     UINT16 uFieldsDetail[] = {2};   // To the second field of Orders
  32.                                     //   (Which is indexed)
  33.  
  34.     Screen("*** Linked Cursors Example ***\r\n");
  35.  
  36.     BREAK_IN_DEBUGGER();
  37.  
  38.     Screen("    Initializing the engine...");
  39.     if (InitAndConnect(&hDb) != DBIERR_NONE)
  40.     {
  41.         Screen("\r\n*** End of Example ***");
  42.         return;
  43.     }
  44.  
  45.     Screen("    Setting the database directory...");
  46.     rslt = DbiSetDirectory(hDb, (pCHAR)szTblDirectory);
  47.     ChkRslt(rslt, "SetDirectory");
  48.  
  49.     Screen("    Open the %s master table...", szMasterTable);
  50.     rslt = DbiOpenTable(hDb, (pCHAR)szMasterTable, (pCHAR)szTblType, NULL, NULL,
  51.                         0, dbiREADWRITE, dbiOPENSHARED, xltFIELD, FALSE, NULL,
  52.                         &hCurMaster);
  53.     if (ChkRslt(rslt, "OpenTable") != DBIERR_NONE)
  54.     {
  55.         CloseDbAndExit(&hDb);
  56.         Screen("\r\n*** End of Example ***");
  57.         return;
  58.     }
  59.  
  60.     Screen("    Display the first %lu records of the %s master table...",
  61.            ulNumRecs, szMasterTable);
  62.     DisplayTable(hCurMaster, ulNumRecs);
  63.  
  64.     Screen("\r\n    Open the %s detail table...", szDetailTable);
  65.     rslt = DbiOpenTable(hDb, (pCHAR)szDetailTable,(pCHAR)szTblType, NULL, NULL,
  66.                         0, dbiREADWRITE, dbiOPENSHARED, xltFIELD, FALSE, NULL,
  67.                         &hCurDetail);
  68.     if (ChkRslt(rslt, "OpenTable") != DBIERR_NONE)
  69.     {
  70.           CloseDbAndExit(&hDb);
  71.           Screen("\r\n*** End of Example ***");
  72.           return;
  73.      }
  74.  
  75.     Screen("    Display the first %lu records of the %s detail table...",
  76.            ulNumRecs, szDetailTable);
  77.     DisplayTable(hCurDetail, ulNumRecs);
  78.  
  79.     Screen("\r\n    Set to the Customer_No index on the detail table...");
  80.     rslt = DbiSwitchToIndex(&hCurDetail, NULL, NULL, 2, FALSE);
  81.     ChkRslt(rslt, "SwitchToIndex");
  82.  
  83.     Screen("    Link the tables...");
  84.  
  85.     // Put the Customer table into link mode.
  86.     rslt = DbiBeginLinkMode(&hCurMaster);
  87.     ChkRslt(rslt, "BeginLinkMode");
  88.  
  89.     // Put the Orders table into link mode.
  90.     rslt = DbiBeginLinkMode(&hCurDetail);
  91.     ChkRslt(rslt, "BeginLinkMode");
  92.  
  93.     // Link the two tables, specifying which fields
  94.     //   will be linked in the last two parameters.
  95.     //   Specifically, link the first field of Customers
  96.     //   to the indexed second field of Orders.
  97.     rslt = DbiLinkDetail(hCurMaster, hCurDetail, 1, uFieldsMaster,
  98.                          uFieldsDetail);
  99.     ChkRslt(rslt, "LinkDetail");
  100.  
  101.     Screen("    Display the %s detail table after the link:",
  102.            szDetailTable);
  103.     Screen("        Note that all Customer No's correspond to the last"
  104.            " record displayed in\r\n            the master table");
  105.     DisplayTable(hCurDetail, ulNumRecs);
  106.  
  107.     Screen("\r\n    End the link...");
  108.  
  109.     // Unlink the detail table from the master table.
  110.     rslt = DbiUnlinkDetail(hCurDetail);
  111.     ChkRslt(rslt, "EndLinkMode");
  112.  
  113.     // Take the Customer table out of link mode.
  114.     rslt = DbiEndLinkMode(&hCurMaster);
  115.     ChkRslt(rslt, "EndLinkMode");
  116.  
  117.     // Take the Orders table out of link mode.
  118.     rslt = DbiEndLinkMode(&hCurDetail);
  119.     ChkRslt(rslt, "EndLinkMode");
  120.  
  121.     Screen("    Close the tables...");
  122.  
  123.     // Close the Master table.
  124.     rslt = DbiCloseCursor(&hCurMaster);
  125.     ChkRslt(rslt, "CloseCursor");
  126.  
  127.     // Close the detail table.
  128.     rslt = DbiCloseCursor(&hCurDetail);
  129.     ChkRslt(rslt, "CloseCursor");
  130.  
  131.     Screen("    Close the database and exit IDAPI...");
  132.     CloseDbAndExit(&hDb);
  133.  
  134.     Screen("\r\n*** End of Example ***");
  135. }
  136.