// BDE - (C) Copyright 1995 by Borland International // LnkCrsr.c #include "snipit.h" static const char szMasterTable[] = "customer"; static const char szDetailTable[] = "orders"; static const char szTblType[] = szPARADOX; //===================================================================== // Function: // LnkCrsr(); // // Description: // Linking cursors establishes a link between two cursors // such that the detail cursor has its record set limited to // the set of records matching the linking key values of the // master cursor. //===================================================================== void LnkCrsr (void) { hDBIDb hDb; // Handle to the database hDBICur hCurMaster; // Handle to the master table hDBICur hCurDetail; // Handle to the detail table UINT32 ulNumRecs = 10; // Number of records to display, // 0 = all UINT16 uFieldsMaster[] = {1}; // Link the first field of Customer UINT16 uFieldsDetail[] = {2}; // To the second field of Orders // (which is indexed) DBIResult rslt; // Return value from IDAPI functions Screen("*** Linked Cursors Example ***\r\n"); BREAK_IN_DEBUGGER(); Screen(" Initializing the engine..."); if (InitAndConnect(&hDb) != DBIERR_NONE) { Screen("\r\n*** End of Example ***"); return; } Screen(" Setting the database directory..."); rslt = DbiSetDirectory(hDb, (pCHAR) szTblDirectory); ChkRslt(rslt, "SetDirectory"); Screen(" Open the %s master table...", szMasterTable); rslt = DbiOpenTable(hDb, (pCHAR) szMasterTable, (pCHAR) szTblType, NULL, NULL, 0, dbiREADWRITE, dbiOPENSHARED, xltFIELD, FALSE, NULL, &hCurMaster); if (ChkRslt(rslt, "OpenTable") != DBIERR_NONE) { CloseDbAndExit(&hDb); Screen("\r\n*** End of Example ***"); return; } Screen(" Display the first %lu records of the %s master table...", ulNumRecs, szMasterTable); DisplayTable(hCurMaster, ulNumRecs); Screen("\r\n Open the %s detail table...", szDetailTable); rslt = DbiOpenTable(hDb, (pCHAR) szDetailTable, (pCHAR) szTblType, NULL, NULL, 0, dbiREADWRITE, dbiOPENSHARED, xltFIELD, FALSE, NULL, &hCurDetail); if (ChkRslt(rslt, "OpenTable") != DBIERR_NONE) { CloseDbAndExit(&hDb); Screen("\r\n*** End of Example ***"); return; } Screen(" Display the first %lu records of the %s detail table...", ulNumRecs, szDetailTable); DisplayTable(hCurDetail, ulNumRecs); Screen("\r\n Set to the Customer_No index on the detail table..."); rslt = DbiSwitchToIndex(&hCurDetail, NULL, NULL, 2, FALSE); ChkRslt(rslt, "SwitchToIndex"); Screen(" Link the tables..."); // Put the Customer table into link mode. rslt = DbiBeginLinkMode(&hCurMaster); ChkRslt(rslt, "BeginLinkMode"); // Put the Orders table into link mode. rslt = DbiBeginLinkMode(&hCurDetail); ChkRslt(rslt, "BeginLinkMode"); // Link the two tables, specifying which fields // will be linked in the last two parameters. // Specifically, link the first field of Customers // to the indexed second field of Orders. rslt = DbiLinkDetail(hCurMaster, hCurDetail, 1, uFieldsMaster, uFieldsDetail); ChkRslt(rslt, "LinkDetail"); Screen(" Display the %s detail table after the link:", szDetailTable); Screen(" Note that all Customer numbers correspond to the last" " record displayed in\r\n the master table"); DisplayTable(hCurDetail, ulNumRecs); Screen("\r\n End the link..."); // Unlink the detail table from the master table. rslt = DbiUnlinkDetail(hCurDetail); ChkRslt(rslt, "EndLinkMode"); // Take the Customer table out of link mode. rslt = DbiEndLinkMode(&hCurMaster); ChkRslt(rslt, "EndLinkMode"); // Take the Orders table out of link mode. rslt = DbiEndLinkMode(&hCurDetail); ChkRslt(rslt, "EndLinkMode"); Screen(" Close the tables..."); // Close the master table. rslt = DbiCloseCursor(&hCurMaster); ChkRslt(rslt, "CloseCursor"); // Close the detail table. rslt = DbiCloseCursor(&hCurDetail); ChkRslt(rslt, "CloseCursor"); Screen(" Close the database and exit IDAPI..."); CloseDbAndExit(&hDb); Screen("\r\n*** End of Example ***"); }