Retain in VDF

by Peter Bosch

In VDF Retain fields can't be cleared anymore, neither with pressing F5 twice nor with Ctrl+F5. These subclasses now allow you to have Retain-fields with the ability to clear them with Ctrl+F5 (pressing F5 twice has no effect)

Usage:

Just use the RETAIN Checkbox in the Database Builder as usual. All other things are handled by the subclasses.

RETAIN_ALL reacts like before: no Clearing at all.

What I do is query if the DD_RETAIN is set for every field. If so, then I clear the original RETAIN setting and replace it with my own settings at runtime.
This means that once you put the code below in your subclasses it will work. You don't need to change your individual .dd files to use it.

Note: make sure that the Database builder and the IDE are using your subclasses instead of the global subclasses from Data Access.

Definitions in your own DataDictionary Class

Class ITDataDictionary is a DataDictionary

  Procedure Construct_Object
    Object Tab_Retain_Fields Is An Array
    End_Object

    Object Tab_Retain_Value Is An Array
    End_Object
    Forward Send Construct_Object
    Property Integer pNoDefaults Public False
    Send Define_Retain_Fields
  End_Procedure

  // Set Retain State for a Field //
  Procedure Set Field_Retain_State Integer iField Integer iState
    Set Array_Value of (Tab_Retain_Fields(Self)) Item iField to iState
  End_Procedure

  // Query Retain-State //
  Function Field_Retain_State Integer iField Returns Integer
    Integer iState
    Get Integer_Value of (Tab_Retain_Fields(Self)) Item iField to iState
    Function_Return iState
  End_Function

  Procedure Define_Retain_Fields
    Integer iCount I iRetain
    Get Field_Count to iCount
    For I From 1 to iCount
      Get Field_Option I DD_RETAIN to iRetain
      If iRetain Begin
        Set Field_Options I to DD_CLEAR_FIELD_OPTIONS DD_RETAIN
        Set Field_Retain_State I to True
      End
    Loop
  End_Procedure

  // If the field is RETAIN: Default Values, if Ctrl+F5 pressed: no Default Values //
  Procedure Field_Defaults
    Integer I Anz iState
    String Val
    Forward Send Field_Defaults
    If (Not(pNoDefaults(Self))) Begin // Defaults only, if not Ctrl+F5
      Get Field_Count to Anz
      For I From 1 to Anz
        Get Array_Value of (Tab_Retain_Fields(Self)) Item I to iState
        If iState Begin // Retain-Field
          Get Array_Value of (Tab_Retain_Value(Self)) Item I to Val
          Set Field_Default_Value I to Val
        End
      Loop
    End
    Set pNoDefaults to False
  End_Procedure

  // Save Database Values for RETAIN //
  Procedure ITSave_DDO
    Integer I Anz iState
    String Val
    Get Field_Count to Anz
    For I From 1 to Anz
      Get Integer_Value of (Tab_Retain_Fields(Self)) Item I to iState
      If iState Begin // Retain-Feld
        Get Field_Current_Value I to Val
        Set Array_Value of (Tab_Retain_Value(Self)) Item I to Val
      End
    Loop
  End_Procedure
End_Class

Definitions in your own dbForm Class and your dbView Class

Procedure Request_Save
  Integer Svr#
  Get Server to Svr#
  If (Svr# > 0) Send ITSave_DDO to Svr#
  Forward Send Request_Save
End_Procedure

Procedure Request_Clear
  Integer Feld# Svr#
  Get Server to Svr#
  If (Svr# > 0) Send ITSave_DDO to Svr#
  Forward Send Request_Clear
End_Procedure

Procedure Request_Clear_All
  Integer Svr#
  Forward Send Request_Clear_All
  Get Server to Svr#
  If (Svr# > 0) Begin
    Set pNoDefaults of Svr# to True
    Send Clear to Svr#
  End
End_Procedure