diff --git a/src/Runtime/XSharp.Rdd/DbfCdx/Tag/CdxTag.prg b/src/Runtime/XSharp.Rdd/DbfCdx/Tag/CdxTag.prg index 96d3b064e8..64677c5d09 100644 --- a/src/Runtime/XSharp.Rdd/DbfCdx/Tag/CdxTag.prg +++ b/src/Runtime/XSharp.Rdd/DbfCdx/Tag/CdxTag.prg @@ -245,14 +245,32 @@ BEGIN NAMESPACE XSharp.RDD.CDX return FALSE elseif strKey:Length == 0 if SELF:RDD Is DBFVFP - foreach var fld in fields - var fldInfo := SELF:_oRdd:_Fields[fld-1] - strKey += String{' ', fldInfo:Length} - next - oKey := strKey + VAR lGotKey := FALSE + TRY + SELF:_oRdd:GoTo(1) + oKey := SELF:_oRdd:EvalBlock(SELF:_KeyCodeBlock) + IF oKey IS STRING VAR strKey2 .AND. strKey2:Length > 0 + lGotKey := TRUE + ENDIF + CATCH + END TRY + IF !lGotKey + VAR cPad := "" + FOREACH VAR fld IN fields + VAR fldInfo := SELF:_oRdd:_Fields[fld-1] + cPad += String{' ', fldInfo:Length} + NEXT + IF cPad:Length > 0 + oKey := cPad + ELSE + var sMessage := __ErrString(VOErrors.INDEX_EXPRESSION_ZEROLENGTH,SELF:_KeyExpr) + SELF:_oRdd:_dbfError(Subcodes.EDB_EXPRESSION,Gencode.EG_SYNTAX, "DBFCDX.EvaluateExpressions",sMessage ,FALSE) + RETURN FALSE + ENDIF + ENDIF else - var sMessage := __ErrString(VOErrors.INDEX_EXPRESSION_ZEROLENGTH,SELF:_KeyExpr) - SELF:_oRdd:_dbfError(Subcodes.EDB_EXPRESSION,Gencode.EG_SYNTAX, "DBFCDX.EvaluateExpressions",sMessage ,FALSE) + var sMessage := __ErrString(VOErrors.INDEX_EXPRESSION_ZEROLENGTH, SELF:_KeyExpr) + SELF:_oRdd:_dbfError(Subcodes.EDB_EXPRESSION, Gencode.EG_SYNTAX, "DBFCDX.EvaluateExpressions", sMessage, FALSE) return FALSE endif endif diff --git a/src/Runtime/XSharp.VFP.Tests/IndexOnTrimTests.prg b/src/Runtime/XSharp.VFP.Tests/IndexOnTrimTests.prg new file mode 100644 index 0000000000..262054fc11 --- /dev/null +++ b/src/Runtime/XSharp.VFP.Tests/IndexOnTrimTests.prg @@ -0,0 +1,59 @@ +using System +using System.IO +using XUnit + +begin namespace XSharp.VFP.Tests + class IndexOnTrimTests + static constructor + XSharp.RuntimeState.Dialect := XSharpDialect.FoxPro + end constructor + + [Fact]; + method TestIndexOnAllTrim() as void + var cOldDir := System.IO.Directory.GetCurrentDirectory() + var oDir := System.IO.Directory.CreateDirectory(; + Path.Combine(Path.GetTempPath(), ; + "IdxTrimTest_" + Guid.NewGuid():ToString("N"))) + var cTempPath := oDir:FullName + + try + SET DEFAULT TO (cTempPath) + CREATE TABLE TrimTest (Id int, Name c(30), City C(20)) + INSERT INTO TrimTest VALUES(1, " Alpha ", "Berlin") + INSERT INTO TrimTest VALUES(2, "Beta", "Munich") + INSERT INTO TrimTest VALUES(3, " Gamma ", "") + INSERT INTO TrimTest VALUES(4, "", "Hamburg") + + INDEX ON ALLTRIM(Name) TAG NameIdx + GO TOP + Assert.Equal(4, (int)RecNo()) + SKIP + Assert.Equal(1, (int)RecNo()) + + INDEX ON LTRIM(Name) TAG LNameIdx + GO TOP + Assert.True(RecNo() > 0) + + INDEX ON RTRIM(Name) TAG RNameIdx + GO TOP + Assert.True(RecNo() > 0) + + INDEX ON UPPER(SUBSTR(LTRIM(Name), 1, 5)) TAG SubIdx + GO TOP + Assert.True(RecNo() > 0) + + INDEX ON ALLTRIM(Name) + ALLTRIM(City) TAG CombIdx + GO TOP + Assert.True(RecNo() > 0) + finally + XSharp.CoreDb.CloseAll() + SET DEFAULT TO (cOldDir) + System.IO.Directory.SetCurrentDirectory(cOldDir) + try + System.IO.Directory.Delete(cTempPath) + catch + end try + end try + end method + end class +end namespace diff --git a/src/Runtime/XSharp.VFP.Tests/XSharp.VFP.Tests.xsproj b/src/Runtime/XSharp.VFP.Tests/XSharp.VFP.Tests.xsproj index ab45411505..c1f9c2aa0b 100644 --- a/src/Runtime/XSharp.VFP.Tests/XSharp.VFP.Tests.xsproj +++ b/src/Runtime/XSharp.VFP.Tests/XSharp.VFP.Tests.xsproj @@ -98,6 +98,7 @@ +