Duration (Pacific Standard Time):
To (Pacific Standard Time):
Impact:
User Action:
Visual FoxPro 9.0 SP2

GETFLDSTATE( ) Function

Returns a numeric value indicating if a field in a table or cursor has been modified or had a record appended, or if the deleted status of the current record has been changed.


GETFLDSTATE(cFieldName | nFieldNumber [, cTableAlias | nWorkArea])

Numeric, Character, or .NULL.

cFieldName| nFieldNumber

Specifies the name of the field or the number of the field for which the modification status is returned. The field number nFieldNumber corresponds to the position of the field in the table or cursor structure. DISPLAY STRUCTURE or FIELD( ) can be used to determine a field's number.

You can specify –1 for nFieldNumber to return a character string consisting of deletion and modification status values for all fields in the table or cursor. For example, if a table has five fields and only the first field has been changed, GETFLDSTATE( ) returns 121111.

The 1 in the first position indicates the deletion status has not been changed.

You can also include 0 for nFieldNumber to determine if the deletion status of the current record has changed since the table or cursor was opened.

Note:

Using GETFLDSTATE() only determines if the deletion status of the current record has changed. For example, if you mark a record for deletion and then recall it, GETFLDSTATE() indicates the deletion status has changed even though the record's deletion status has returned to its original state. Use DELETED() to determine the current deletion status of a record.

cTableAlias

Specifies the alias of the table or cursor for which the field modification or record deletion status is returned.

nWorkArea

Specifies the work area of the table or cursor for which the field modification or record deletion status is returned.

If you do not specify an alias or work area, GETFLDSTATE( ) returns a value for a field in the currently selected table or cursor.

The following table lists the character return values and the corresponding modification or deletion status.

Return value

Modification or deletion status

1

Field has not been modified or deletion status has not changed.

2

Field has been modified or deletion status has changed.

3

Field in an appended record has not been modified or deletion status has not changed for the appended record.

4

Field in an appended record has been modified or deletion status has changed for the appended record.

.NULL.

At EOF( )

Row or table buffering must first be enabled with CURSORSETPROP( ) for GETFLDSTATE( ) to operate on local tables.

The modification or deletion status is returned for the table or cursor open in the currently selected work area if GETFLDSTATE( ) is issued without the optional cTableAlias or nWorkArea arguments.

Any change in a field will cause GETFLDSTATE() to return a value showing that the field has been modified, whether the change is explicit or implicit. An example of an explicit modification would be including the field in a REPLACE or INSERT INTO command. An implicit modification occurs in a field that has a default value when any command is issued that adds a new record.

The following example demonstrates how you can use GETFLDSTATE( ) to determine if the contents of a field have changed. MULTILOCKS is set to ON, a requirement for table buffering. The customer table in the testdata database is opened, and CURSORSETPROP( ) is then used to set the buffering mode to optimistic table buffering (5).

GETFLDSTATE( ) is issued to display a value (1) corresponding to the unmodified state of the cust_id field before it is modified. The cust_id field is modified with REPLACE, and GETFLDSTATE( ) is issued again to display a value (2) corresponding to the modified state of the cust_id field. TABLEREVERT( ) is used to return the table to its original state, and GETFLDSTATE( ) is issued again to display a value (1) corresponding to the original state of the cust_id field.

CLOSE DATABASES
CLEAR

SET MULTILOCKS ON         && Allow table buffering
OPEN DATABASE (HOME(2) + 'data\testdata')
USE Customer             && Open customer table
=CURSORSETPROP("Buffering",5,"customer")  && Enable table buffering

* Get field state on original cust_id field and display state
nState=GETFLDSTATE("cust_id")
DO DisplayState WITH nState, "Original"

* Change field contents and display state
REPLACE cust_id    WITH "***"
nState=GETFLDSTATE("cust_id")
DO DisplayState WITH nState, "After Replace"

* Discard table changes and display state
= TABLEREVERT(.T.)        && Discard all table changes
nState=GETFLDSTATE("cust_id")
DO DisplayState WITH nState, "After Revert"

PROCEDURE DisplayState
PARAMETER nState,cOperation
DO CASE
   CASE nState=1
      =MESSAGEBOX("Field has not been modified",0,cOperation)
   OTHERWISE
      =MESSAGEBOX("Field has been modified",0,cOperation)
ENDCASE

The following example shows the difference in behavior between fields with and without default values.

SET MULTILOCKS ON
CREATE DATABASE example
CREATE TABLE customer (cust_id C(6),state C(2) DEFAULT "FL")
CLOSE TABLES
USE customer
=CURSORSETPROP("Buffering",5,"customer")

APPEND BLANK
?GETFLDSTATE("cust_id")     && Returns 3, field in an appended record has
                            && not been modified.

?GETFLDSTATE("state")    && Returns 4, field in an appended record has
                         && been modified.