Technical Information Database TI186B.txt Comparison filters. Category :General Programming Platform :All Product :BDE All Description: /* This example shows how to set a filter on the first N characters of a character field. To use this example, backup the FILTER.C file in the BDE\EXAMPLES\SNIPIT directory. Copy this file to FILTER.C in that directory. Then compile and run SNIPIT, running the 'Cursor: Setting and Using filters' example. */ // BDE - (C) Copyright 1994 by Borland International // Filter.c #include "snipit.h" static const char szTblName[] = "customer"; static const char szTblType[] = szPARADOX; //============================================================== // Function: // Filter(); // // Description: // This example shows how to use filters to limit the // result set of a table. Filters perform a function // similar to that of ranges, but more powerful // operations are supported. //============================================================== void Filter (void) { hDBIDb hDb; // Handle to the database. hDBICur hCur; // Handle to the table. pBYTE pcanExpr; // Structure containing // filter info. hDBIFilter hFilter; // Filter handle. UINT16 uSizeNodes; // Size of the nodes in the // tree. UINT16 uSizeCanExpr; // Size of the header // information. UINT16 uSizeLiterals; // Size of the literals. UINT16 uTotalSize; // Total size of the filter // expression. UINT32 uNumRecs = 10; // Number of records to // display. CANExpr canExp; // Contains the header // information. UINT16 Nodes[] = // Nodes of the filter // tree. { // Offset 0 nodeCOMPARE, // canCompare.nodeClass canEQ, // canCompare.canOp 1, // canCompare.bCaseInsensitive 5, // canCompare.iParialLen (0 if // full length) 12, // canBinary.iOperand1 20, // canBinary.iOperand2 // Offsets in the Nodes array // Offset 12 nodeFIELD, // canField.nodeClass canFIELD, // canField.canOp 2, // canField.iFieldNum 0, // canField.iNameOffset: szField // is the literal at offset 0 // Offset 20 nodeCONST, // canConst.nodeClass canCONST, // canConst.canOp fldZSTRING, // canConst.iType 6, // canConst.iSize 5 // canConst.iOffset: szConst is // the literal at offset // strlen(szField) + 1 }; // Name of the field for the third node of the tree. CHAR szField[] = "NAME"; // Value of the constant for the second node of the tree. CHAR szConst[] = "OCEAN"; // Return value from IDAPI functions. DBIResult rslt; Screen("*** Filter Example ***\r\n"); BREAK_IN_DEBUGGER(); Screen(" Initializing IDAPI..."); 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 table...", szTblName); rslt = DbiOpenTable(hDb, (pCHAR) szTblName, (pCHAR) szTblType, NULL, NULL, 0, dbiREADWRITE, dbiOPENSHARED, xltFIELD, FALSE, NULL, &hCur); if (ChkRslt(rslt, "OpenTable") != DBIERR_NONE) { CloseDbAndExit(&hDb); Screen("\r\n*** End of Example ***"); return; } // Go to the beginning of the table rslt = DbiSetToBegin(hCur); ChkRslt(rslt, "SetToBegin"); Screen("\r\n Display the %s table...", szTblName); DisplayTable(hCur, uNumRecs); uSizeNodes = sizeof(Nodes); // Size of the nodes. // Size of the literals. uSizeLiterals = strlen(szField) + 1 + strlen(szConst) + 1; // Size of the header information. uSizeCanExpr = sizeof(CANExpr); // Total size of the filter. uTotalSize = uSizeCanExpr + uSizeNodes + uSizeLiterals; // Initialize the header information canExp.iVer = 1; // Version. canExp.iTotalSize = uTotalSize; // Total size of the // filter. canExp.iNodes = 3; // Number of nodes. canExp.iNodeStart = uSizeCanExpr; // The offset in the // buffer where the // expression nodes // start. // The offset in the buffer where the literals start. canExp.iLiteralStart = uSizeCanExpr + uSizeNodes; // Allocate space for the filter expression. pcanExpr = (pBYTE)malloc(uTotalSize * sizeof(BYTE)); if (pcanExpr == NULL) { Screen(" Could not allocate memory..."); DbiCloseCursor(&hCur); CloseDbAndExit(&hDb); Screen("\r\n*** End of Example ***"); return; } // Initialize the filter expression. memmove(pcanExpr, &canExp, uSizeCanExpr); memmove(&pcanExpr[uSizeCanExpr], Nodes, uSizeNodes); memmove(&pcanExpr[uSizeCanExpr + uSizeNodes], szField, strlen(szField) + 1); // First litteral memmove(&pcanExpr[uSizeCanExpr + uSizeNodes + strlen(szField) + 1], szConst, strlen(szConst) + 1); // Second litteral rslt = DbiSetToBegin(hCur); ChkRslt(rslt, "SetToBegin"); Screen("\r\n Add a filter to the %s table which will" " limit the records\r\n which are displayed" " to those whose %s field starts with '%s'...", szTblName, szField, szConst); rslt = DbiAddFilter(hCur, 0L, 1, FALSE, (pCANExpr)pcanExpr, NULL, &hFilter); if (ChkRslt(rslt, "AddFilter") != DBIERR_NONE) { rslt = DbiCloseCursor(&hCur); ChkRslt(rslt, "CloseCursor"); free(pcanExpr); CloseDbAndExit(&hDb); Screen("\r\n*** End of Example ***"); return; } // Activate the filter. Screen(" Activate the filter on the %s table...", szTblName); rslt = DbiActivateFilter(hCur, hFilter); ChkRslt(rslt, "ActivateFilter"); rslt = DbiSetToBegin(hCur); ChkRslt(rslt, "SetToBegin"); Screen("\r\n Display the %s table with the filter" " set...", szTblName); DisplayTable(hCur, uNumRecs); Screen("\r\n Deactivate the filter..."); rslt = DbiDeactivateFilter(hCur, hFilter); ChkRslt(rslt, "DeactivateFilter"); Screen("\r\n Drop the filter..."); rslt = DbiDropFilter(hCur, hFilter); ChkRslt(rslt, "DropFilter"); rslt = DbiCloseCursor(&hCur); ChkRslt(rslt, "CloseCursor"); free(pcanExpr); Screen(" Close the database and exit IDAPI..."); CloseDbAndExit(&hDb); Screen("\r\n*** End of Example ***"); } Reference: 7/15/98 3:24:21 PM
Last Modified: 01-SEP-99