docs: public int doRecordChange(FieldInfo field, int iChangeType, boolean bDisplayOption)
      { // Read a valid record
          int iErrorCode = DBConstants.NORMAL_RETURN;
          switch (iChangeType)
          {
              case DBConstants.LOCK_TYPE:
                  try   {
                      this.getHistoryRecord().addNew();
                  } catch (DBException ex)    {
                      ex.printStackTrace(); // Never
                  }
                  int iLastField = this.getOwner().getFieldCount() + DBConstants.MAIN_FIELD - 1;
                  for (int iFieldSeq = DBConstants.MAIN_FIELD; iFieldSeq <= iLastField; iFieldSeq++)
                  {   // Move all the current fields to the history table
                      BaseField fldDest = this.getHistoryRecord().getField(iFieldSeq);
                      BaseField fldSource = this.getOwner().getField(iFieldSeq);
                      if ((fldSource == null)
                          || (!fldDest.getFieldName().equals(fldSource.getFieldName())))
                              fldSource = this.getHistoryRecord().getField(fldDest.getFieldName());    // Being very careful
                      if (fldSource != null)
                          fldDest.moveFieldToThis(fldSource);
                  }
                  break;
              case DBConstants.AFTER_UPDATE_TYPE:
              case DBConstants.AFTER_DELETE_TYPE:
  //x                if (this.getOwner().isModified())
                  {
                      this.moveDateToTarget();
                      iErrorCode = DBConstants.ERROR_RETURN;
                      while (iErrorCode != DBConstants.NORMAL_RETURN)
                      {
                          try {
                              if (this.getHistoryRecord().getEditMode() == DBConstants.EDIT_ADD)  // It is possible that a nested set called this already
                                  if (this.getOwner().isModified(true))
                                      this.getHistoryRecord().add();
                              iErrorCode = DBConstants.NORMAL_RETURN; // Good
                          } catch(DBException ex) {
                              iErrorCode = ex.getErrorCode();
                              if ((iErrorCode != DBConstants.DUPLICATE_KEY) && (iErrorCode != DBConstants.DUPLICATE_COUNTER))
                              {
                                  ex.printStackTrace();
                                  break;
                              }
                              else
                              {
                                  DateTimeField fieldTarget = (DateTimeField)this.getHistoryRecord().getField(m_iHistoryDateSeq);
                                  Date dateBefore = this.bumpTime(fieldTarget);
                                  if ((fieldTarget.getDateTime() == null)
                                      || (fieldTarget.getDateTime().equals(dateBefore)))
                                          break;  // Should never happen - being careful.
                                  // Try again
                              }
                          }
                      }
                  }
                  break;
          }
          return super.doRecordChange(field, iChangeType, bDisplayOption);        // Initialize the record
      }