Q123975: How to Read Fields in a Table from the LCK
Article: Q123975
Product(s): Microsoft FoxPro
Version(s): WINDOWS:2.6a,3.0
Operating System(s):
Keyword(s): kbcode
Last Modified: 11-FEB-2000
-------------------------------------------------------------------------------
The information in this article applies to:
- Microsoft Visual FoxPro for Windows, version 3.0
- Microsoft FoxPro for Windows, version 2.6a
-------------------------------------------------------------------------------
SUMMARY
=======
This article explains how to read the contents of a field in a table using the
Library Construction Kit (LCK).
MORE INFORMATION
================
When you write a C program using the Library Construction Kit, you may sometimes
need to know the value of a field in a table. To find that value, follow these
steps:
1. Call the _NameTableIndex() function. It returns a name table index that
corresponds to the field name.
2. Call the _FindVar() function. It uses the name table index to fill a Locator
structure with information about the field.
3. Call the _Load() function. It uses the information in the Locator structure
to place values for the field in a Value structure.
4. Refer to the Value structure. It contains the contents of the field
initialized in Step 3. For more information on the nature of a Locator and
Value structure, please see the "Data Structures" section in the Microsoft
FoxPro Library Construction Kit documentation.
Example
-------
The following code sample illustrates the concepts explained above. This code can
be compiled into an FLL for use with FoxPro for Windows, a PLB for use with
FoxPro for MS-DOS, or an MLB for use with FoxPro for Macintosh. This code
creates a function called ReadDb.
The syntax for the ReadDb() function is:
ReadDb(<expN>,<expC>)
- expN is the work area in which the table is located. If a work area of 0 is
specified, ReadDb() will search all works areas to find the specified field.
- expC is the field whose value this function should display.
For example, if a table located in work area 1 has a character field named flda,
you could use the following ReadDb function to find the value of the field:
= ReadDb(1,"flda")
Code Sample
-----------
#include <pro_ext.h>
void FAR ReadDb(ParamBlk FAR *parm)
{
char FAR * fldname ; // name of field
char FAR * fldtxt ; // contents of field
NTI nti; // for _NameTableIndex
Locator loc; // a locator structure
Value val ; // a value structure
// Increase the size of the handle to the character string
// containing the field name so it can be null terminated.
if (!_SetHandSize(parm->p[1].val.ev_handle, parm->p[1].val.ev_length +
1))
{
_Error(182); // "Insufficient memory"
}
// Lock the handle to the character string containing
// the name of the field.
_HLock(parm->p[1].val.ev_handle) ;
// Establish a pointer to the character string containing
// the name of the field.
fldname = (char FAR *) _HandToPtr(parm->p[1].val.ev_handle) ;
// Null terminate the character string containing the
// name of the field.
fldname[parm->p[1].val.ev_length] = '\0' ;
// Get nti value for the field.
nti = _NameTableIndex(fldname) ;
// Unlock the handle to the character string containing
// the name of the field.
_HUnLock(parm->p[1].val.ev_handle) ;
if (nti == -1)
{
// This should not happen if a valid field name was passed.
_PutStr("\nNameTableIndex Failure") ;
}
else
{
// Fill locator structure with information about the field:
// Note that the second parameter to the _FindVar() function
// is the first parameter that was passed to this function.
// The first parameter to this function is a numeric value
// specified the work area in which the field is located.
if (! _FindVar(nti, (int) parm->p[0].val.ev_long, &loc))
{
// This should not happen if a valid field name was passed.
_PutStr("\nFindVar Failure") ;
}
else
{
// Fill a value structure with field values.
_Load(&loc,&val) ;
// This code is written to support fields that are of
// type character only.
if (val.ev_type == 'C')
{
// Create a null-terminated string which contains the
// text in the specified field.
if (!_SetHandSize(val.ev_handle, val.ev_length + 1))
{
_Error(182); // "Insufficient memory"
}
_HLock(val.ev_handle) ;
fldtxt = (char FAR *) _HandToPtr(val.ev_handle) ;
fldtxt[val.ev_length] = '\0' ;
// Display the values on the screen.
_PutStr("\n") ;
_PutStr(fldtxt) ;
// Unlock the handle to the text.
_HUnLock(val.ev_handle) ;
}
else
{
_PutStr("\nThe specified field is not of type Character.") ;
}
}
}
}
FoxInfo myFoxInfo[] =
{
{"READDB", (FPFI) ReadDb, 2, "I,C"},
};
FoxTable _FoxTable =
{
(FoxTable FAR *) 0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo
};
Additional query words: VFoxWin 3.00 FoxWin 2.60a
======================================================================
Keywords : kbcode
Technology : kbVFPsearch kbAudDeveloper kbFoxproSearch kbFoxPro260a kbVFP300
Version : WINDOWS:2.6a,3.0
=============================================================================
THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.
Copyright Microsoft Corporation 1986-2002.