When working with Data Dictionary objects you will actually use a small set of DD properties and functions. Those are the methods that allow you check the status of a DDO (is it changed, does it have a record) and allow you to get and set DDO field values. The most commonly used methods are:
Get HasRecord of hoDDO to bHasRecord
HasRecord is used to determine if your DDO has a current record. This can be used to determine if a find operation succeeded (if HasRecord is true), if the DDO buffer did not contain a record prior to the find operation (otherwise, check the Found indicator).
It can also be used to determine if a save will result in a new record save (if HasRecord is false) or an edit of an existing record (if HasRecord is true).
Procedure Refresh integer iMode
Boolean bHasRecord
Handle hoDD
Forward Send Refresh iMode
// if record exists, enable the print button.
Get Server to hoDD
Get HasRecord of hoDD to bHasRecord
Set Enabled_State of oPrintBtn to bHasRecord
End_Procedure // Refresh
Get Should_Save of hoDDO to bChanged
Should_Save can be used to determine if a DDO has changed. If Should_Save is true, the DDO structure has changed and a save may be needed. Should_Save checks the changed state of a DDO and its parent DDOs. It also checks to see if a parent record has been switched.
There is no set variant of this message. Should_Save is set indirectly through data-input or by other messages such as Set File_Field_Changed_Value, Find, Clear, Request_Save, etc.
Get Should_Save of hoDDO to bChanged
If bChanged begin
Get Request_Validate of hoDDO to bError
If (not(bError)) begin
Send Request_Save of hoDDO
End
End
By evaluating Should_Save and HasRecord you can determine the major states of any DDO:
|
HasRecord=True |
HasRecord=False |
Should_Save=True |
A changed record exists. A save will edit the existing record. |
A new changed record. A save will create a new record. |
Should_Save=False |
An unchanged record exists. A save is not needed. |
A new unchanged record. A save is not needed |
Get CurrentRowId of hoDDO to riRec
CurrentRowId returns the RowId of the current record. If there is no current record (HasRecord=false), CurrentRowId will be null. This is often used to store the value of a current record so that it can be re-found at a later time.
Procedure RunUpdate
RowId riCust
// remember the original record
Get CurrentRowId of oCustomer_DD to riCust
// this may change the current record
Send ProcessAllCustomers
// re-find the original record
Send FindByRowId of oCustomer_DD Customer.File_Number riCust
End_Procedure
Get Field_Current_Value of hoDD Field Customer.Name to sName
Set Field_Current_Value of hoDD Field Customer.Name to sName
Get File_Field_Current_Value of hoDD File_Field Customer.Name to sName
Set File_Field_Current_Value of hoDD File_Field Customer.Name to sName
These messages are used to retrieve and change a field’s value. Get Field_Current_Value is used to retrieve the current value of a field. This message is used frequently.
You will note that many of the samples use the file buffer to directly obtain the value of a field (e.g. Move Customer.Name to sName). This is discussed in detail in Understanding File Buffers and DDO Field Buffers.
There are two variants of the message, “Field” and “File_Field”. This is discussed in Understanding the File_Field and Field Keywords.
The set version of this message is used to change the current value of a field. You change the value of DDO field in preparation for a save. When you change a field’s value you must also change its changed-state. This can be done with the Field_Changed_State message.
Set Field_Current_Value of hoDD Field Customer.Name to sName
Set Field_Changed_state of hoDD Field Customer.Name to True
The message File_Field_Changed_Value performs both of these operations and is usually used for this purpose. Therefore, the Set File_Field_Current_Value message is rarely used.
If a save operation is not changing the value of changed field, check if you are using Field_Current_Value instead of Field_Changed_Value. This is a common mistake.
Set Field_Changed_Value of hoDD Field Customer.Name to sName
Set File_Field_Changed_Value of hoDD File_Field Customer.Name to sName
This message is used to change the current value of a field and to set the field’s changed state to true. This is a commonly used message and is the suggested method for changing DDO field values in preparation for a save. This message is only used for changing values. There is no get version of this message.
Function ChangeName RowId riRecId string sName returns Boolean
Boolean bErr
Send Clear of oUser_DD
Send FindByRowId of oUser_DD User.File_Number riRecId
If (Found) Begin
// update name and save
Set Field_Changed_Value of oUser_DD field User.Name to sName
Get Request_Validate of oUser_DD to bErr
If (not(bErr)) begin
Send Request_Save of oUser_DD
// if save succeeds, Err indicator is False
Move (Err) to bErr
End
End
Else Begin
Move True to bErr
End
Function_Return bErr
End_Function
You will note that many of the samples use the file buffer to directly set the value of a field (e.g. Move sName to Customer.Name). This is discussed in detail in Understanding File Buffers and DDO Field Buffers.
There are two variants of the message, “Field” and “File_Field”. This is discussed in Understanding the File_Field and Field Keywords.