community.borland.com

Article #15186: Comparison filters.

 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