docs: public int doMove(int iRelPosition) throws DBException
      {
          // Note: actually, I should check if (iRelPos == FIRST) rec.moveFirst(),
          //  but, I use the same constants for First/Last as JDBC
          if (this.getRecord().getDefaultOrder() != m_iLastOrder)
          {   // Order was changed
              int iCurrentRow = -1;
              if (m_iLastOrder == -1)
                  iCurrentRow = m_iRow;   // Special case... A seek was done between the last read, so I need to return to the current row instead of the first row
              this.setResultSet(null, DBConstants.SQL_SELECT_TYPE);
              if (iCurrentRow != -1)
                  if (iRelPosition != DBConstants.FIRST_RECORD)
                      if (iRelPosition != DBConstants.LAST_RECORD)
                          iRelPosition = iRelPosition + iCurrentRow + 1;   // Special case... This will set the target position to the correct (next) row
              m_iLastOrder = this.getRecord().getDefaultOrder();
              m_iEOFRow = Integer.MAX_VALUE;
          }
          if ((iRelPosition == DBConstants.PREVIOUS_RECORD) && (m_iRow == -1))
              iRelPosition = DBConstants.LAST_RECORD;
          int iTargetPosition = m_iRow + iRelPosition;
          if (iRelPosition == DBConstants.FIRST_RECORD)
              iTargetPosition = 0;    // First Record
          if (iRelPosition == DBConstants.LAST_RECORD)
              iTargetPosition = m_iEOFRow;    // Last Record
          if (m_iRow != -1) 
              if (iTargetPosition != -1)
                  if (iTargetPosition <= m_iRow)
                      this.setResultSet(null, DBConstants.SQL_SELECT_TYPE);   // Have to start from the beginning
      // Do the move
          ResultSet resultSet = (ResultSet)this.getResultSet();
          try {
              if ((resultSet == null) || (resultSet.isClosed())) {
                  Vector<BaseField> vParamList = new Vector<BaseField>();
                  String strRecordset = this.getRecord().getSQLQuery(
                          SQLParams.USE_SELECT_LITERALS, vParamList);
                  resultSet = this.executeQuery(strRecordset,
                          DBConstants.SQL_SELECT_TYPE, vParamList);
                  this.setResultSet(resultSet, DBConstants.SQL_SELECT_TYPE);
                  vParamList.removeAllElements();
              }
          } catch (Exception e) {
              e.printStackTrace();    // Never
              if (e instanceof DBException)
                  throw (DBException)e;
          }
          if (iRelPosition == DBConstants.LAST_RECORD) if (m_iEOFRow == Integer.MAX_VALUE)
          {   // Haven't found EOF yet... find it.
              iTargetPosition = m_iEOFRow;    // Last Record
              this.readNextToTarget(iTargetPosition, iRelPosition); // Get EOF
              iTargetPosition = m_iEOFRow;    // Move to last row
              Vector<BaseField> vParamList = new Vector<BaseField>();
              String strRecordset = this.getRecord().getSQLQuery(SQLParams.USE_SELECT_LITERALS, vParamList);
              resultSet = this.executeQuery(strRecordset, DBConstants.SQL_SELECT_TYPE, vParamList);
              this.setResultSet(resultSet, DBConstants.SQL_SELECT_TYPE);
              vParamList.removeAllElements();
          }
          int iRecordStatus = this.readNextToTarget(iTargetPosition, iRelPosition);
      // Done!
          if (m_iRow != iTargetPosition)
          {
              if (iTargetPosition < 0) if (m_iRow == -1)
                  iRecordStatus |= DBConstants.RECORD_AT_BOF;
              if (CLEANUP_STATEMENTS)
                  this.setResultSet(null, DBConstants.SQL_SELECT_TYPE);  // Close this statement (at EOF)
          }
          return iRecordStatus;
      }