diff --git a/src/Runtime/XSharp.Core/State/EnumSet.prg b/src/Runtime/XSharp.Core/State/EnumSet.prg index b8daf9bac8..d7ea1043cd 100644 --- a/src/Runtime/XSharp.Core/State/EnumSet.prg +++ b/src/Runtime/XSharp.Core/State/EnumSet.prg @@ -6,7 +6,7 @@ USING XSharp USING XSharp.RDD.Enums USING System.Collections.Generic -NAMESPACE XSharp +BEGIN NAMESPACE XSharp /// ENUM Set @@ -431,6 +431,8 @@ ENUM Set END ENUM +END NAMESPACE + #region Defines /// /// diff --git a/src/Runtime/XSharp.RT/RDD/Db.prg b/src/Runtime/XSharp.RT/RDD/Db.prg index b49d395518..1464c3192c 100644 --- a/src/Runtime/XSharp.RT/RDD/Db.prg +++ b/src/Runtime/XSharp.RT/RDD/Db.prg @@ -524,7 +524,7 @@ FUNCTION DbRecordInfo(kInfoType, uRecId, uNewValue) AS USUAL CLIPPER FUNCTION DbRLock(uRecId) AS USUAL CLIPPER RETURN VoDb.RLock(uRecId) - /// + /// FUNCTION DbFlock() AS USUAL CLIPPER RETURN VoDb.Flock() diff --git a/src/Runtime/XSharp.SQLRdd/Metadata/Database.prg b/src/Runtime/XSharp.SQLRdd/Metadata/Database.prg index 0ae77da476..e967942769 100644 --- a/src/Runtime/XSharp.SQLRdd/Metadata/Database.prg +++ b/src/Runtime/XSharp.SQLRdd/Metadata/Database.prg @@ -528,7 +528,7 @@ end class var rdr := (DbDataReader) oPar var pos := SELF:GetPos(rdr, nReason:ToString()) if pos >= 0 - var num := rdr:GetDecimal(pos) + var num := rdr:GetValue(pos) return Convert.ToInt32(num) endif catch diff --git a/src/Runtime/XSharp.SQLRdd/RDD/SQLRDD-Main.prg b/src/Runtime/XSharp.SQLRdd/RDD/SQLRDD-Main.prg index 3927798e28..728aff5956 100644 --- a/src/Runtime/XSharp.SQLRdd/RDD/SQLRDD-Main.prg +++ b/src/Runtime/XSharp.SQLRdd/RDD/SQLRDD-Main.prg @@ -461,6 +461,7 @@ partial class SQLRDD inherit Workarea self:DataTable:RejectChanges() endif _updatedRows:Clear() + // TODO: thomas optimize. Change reccount when adding or deleting a row above instead of reloading data from DB with _GetRecCount self:_GetRecCount() endif return lOk @@ -641,8 +642,10 @@ partial class SQLRDD inherit Workarea OVERRIDE METHOD GoToId(oRec AS OBJECT) AS LOGIC LOCAL result AS LOGIC TRY - VAR nRec := Convert.ToUInt32( oRec ) - result := SELF:GoTo( (DWORD) nRec ) + VAR nRec := Convert.ToUInt32( oRec ) + if nRec != RowNumber + result := SELF:GoTo( (DWORD) nRec ) + endif CATCH ex AS Exception SELF:_dbfError(ex, Subcodes.EDB_GOTO,Gencode.EG_DATATYPE, "SQLRDD.GoToId",FALSE) result := FALSE diff --git a/src/Runtime/XSharp.SQLRdd/RDD/SQLRDD-Private.prg b/src/Runtime/XSharp.SQLRdd/RDD/SQLRDD-Private.prg index 28b043cd8a..2bc962c12d 100644 --- a/src/Runtime/XSharp.SQLRdd/RDD/SQLRDD-Private.prg +++ b/src/Runtime/XSharp.SQLRdd/RDD/SQLRDD-Private.prg @@ -601,16 +601,20 @@ partial class SQLRDD return result PRIVATE METHOD _GotoRecord(nRec as DWORD) AS LOGIC - // Brute walk - SELF:_command:CommandText := _builder:BuildRowNumberStatement(nRec) - var result := SELF:_command:ExecuteScalar(SELF:_oTd:Name) - var iResult := Convert.ToInt64(result) - // shouldn't this be ToUInt32? - - // determine correct page - SELF:_currentPageNo := (INT) ((iResult - 1) / SELF:_oTd:PageSize) + 1 - SELF:_ClearTable() - SELF:DataTable := SELF:_ReadTable("") + + if SELF:DataTable:Rows:Count < 1 + // Brute walk + SELF:_command:CommandText := _builder:BuildRowNumberStatement(nRec) + var result := SELF:_command:ExecuteScalar(SELF:_oTd:Name) + var iResult := Convert.ToInt64(result) + // shouldn't this be ToUInt32? + + // determine correct page + SELF:_currentPageNo := (INT) ((iResult - 1) / SELF:_oTd:PageSize) + 1 + SELF:_ClearTable() + SELF:DataTable := SELF:_ReadTable("") + end if + // locate the row in the page SELF:RowNumber := 1 DO WHILE SELF:RowNumber <= SELF:DataTable:Rows:Count @@ -620,6 +624,7 @@ partial class SQLRDD SELF:RowNumber+= 1 ENDDO RETURN FALSE + PRIVATE METHOD _GotoRow(nRow as LONG) AS LOGIC SELF:_Found := FALSE var nCount := SELF:DataTable:Rows:Count diff --git a/src/Runtime/XSharp.SQLRdd/Support/SqlDbTableCommandBuilder.prg b/src/Runtime/XSharp.SQLRdd/Support/SqlDbTableCommandBuilder.prg index b03be0ea63..8c58e1b76d 100644 --- a/src/Runtime/XSharp.SQLRdd/Support/SqlDbTableCommandBuilder.prg +++ b/src/Runtime/XSharp.SQLRdd/Support/SqlDbTableCommandBuilder.prg @@ -169,7 +169,9 @@ internal class SqlDbTableCommandBuilder cOrderby := Functions.List2String(CurrentOrder:OrderList) if SELF:_oTable:HasRecnoColumn if ! String.IsNullOrEmpty(cOrderby) - cOrderby := cOrderby + ", " + Provider:QuoteIdentifier(self:_oTable:RecnoColumn) + if !cOrderby.Contains(Provider:QuoteIdentifier(self:_oTable:RecnoColumn)) + cOrderby := cOrderby + ", " + Provider:QuoteIdentifier(self:_oTable:RecnoColumn) + endif else cOrderby := Provider:QuoteIdentifier(self:_oTable:RecnoColumn) endif diff --git a/src/Tests/SqlRDDTests/Program.prg b/src/Tests/SqlRDDTests/Program.prg index 1ac0429942..dc069620ae 100644 --- a/src/Tests/SqlRDDTests/Program.prg +++ b/src/Tests/SqlRDDTests/Program.prg @@ -597,8 +597,6 @@ FUNCTION EventHandler(oSender AS Object, e AS XSharp.RDD.SqlRDD.SqlRddEventArgs) case "Index:Customers" e:Value := "PK,CompanyName,ContactName,Address" end switch - case SqlRDDEventReason.SeekReturnsSubset - e:Value := TRUE end switch if showEvents ? "Event", e:Name, e:Reason:ToString(), e:Value @@ -889,7 +887,7 @@ FUNCTION TestGsTutor() AS VOID System.Console.ReadLine() - // UBLIC VIRTUAL METHOD RecordInfo(kRecInfoType, nRecordNumber, uRecVal) AS USUAL CLIPPER + // PUBLIC VIRTUAL METHOD RecordInfo(kRecInfoType, nRecordNumber, uRecVal) AS USUAL CLIPPER //var test := DbRecordInfo(DBRI_LOCKED, 3) // DbRLock(4)