Relate_Main_File - BaseData_Set

Does nothing by default. Called after the normal relate on the main table has been executed.

Type: Event

Parameters: None

Syntax
Procedure Relate_Main_File 

Description

Relate_Main_File does nothing by default. It is called after the normal relate on the main table has been executed. It is an event that allows you to perform custom relates after your main record has been found and related.

If you are going to find an additional record in Relate_Main_File, you must notify the DDO that you have found this new record. You do this by sending the Request_Relate message (if the record was found) or Request_Clear_File (if the record was not found). Request_Relate will also perform a relate on the newly found record.

This is particularly true if the DDO is updating the parent-table DDO of the record you have found. The following code finds a "soft" parent record and notifies a DDO of the find. This sample assumes that Vendor is the Main_File.

Procedure Relate_Main_File
    Boolean bMustFind
    Integer iStatus

    Forward Send Relate_Main_File

    Get_Attribute DF_FILE_STATUS of SoftTable.File_Number to iStatus
 
    If (iStatus = DF_FILE_INACTIVE) Begin
        Move True to bMustFind
    End
    Else If (Vendor.Soft_id <> SoftTable.Soft_id) Begin 
        Move True to bMustFind
    End 

    If bMustFind Begin // relate to SoftTable only if required
        Clear SoftTable
        Move Vendor.Soft_ID to SoftTable.Soft_Id
        Find eq SoftTable.Soft_Id
    End

    Get_Attribute DF_FILE_STATUS of SoftTable.File_Number to iStatus
    If (iStatus<>DF_FILE_INACTIVE) Begin
        Send Request_Relate SoftTable.File_Number
    End
    Else Begin
        Send Request_Clear_File SoftTable.File_Number
    End
End_Procedure


Note the optimization of this procedure. The find in SoftTable is performed only if: (a) the SoftTable record buffer is empty; or (b) the record in the buffer is the wrong one (relating values do not match).

You are strongly encouraged to optimize your finds inside Relate_Main_File. Because DDOs have no way of knowing what this procedure is doing, they have no way of optimizing these finds. Any time a DDO thinks that the custom-related record may be incorrect, it will send Relate_Main_File. It gets sent very often. If you do not optimize your finds (a simple process), you may be slowing down your database operations.

Be aware that Relate_Main_File is not always finding the record that relates to the current record. When parent records are switched, Relate_Main_File will be called during the save process to find a related record(s) for the switched-from and switched-to records. Because of this, CurrentRowId (or the obsolete Current_Record) should not be used in Relate_Main_File procedures. Within Relate_Main_File you should refer to the actual value of the file buffer or the table's RowId (using the GetRowId function). OnNewCurrentRecord can be used to track changes in CurrentRowId.

When accessing table values you should always access the global file buffers and not the DDO buffers (i.e., use "Move Table.Column to var" syntax). See Understanding File Buffers and DDO Field Buffers for more information.

Relate_Main_File and Local DD Relationships

The Request_Relate in Relate_Main_File will ignore local DD relationships using pbUseDDRelates in parent-grandparent relationship and perform a relate command (using hard coded relations on the table).

We recommend not mixing relates in Relate_Main_File and local DD relationships.

See Also

When to Use the File-Buffer | Defining Data Dictionary Events | Understanding Relates and Attaches | Attach_Main_File