使用EhLibCDS进行排序时发现Lookup字段不能排序,于是跟踪源码,发现第113行: IndexFields := IndexFields + SortMarkedColumns[i].FieldName + ';'; 没有对Lookup字段进行判段,下面的 IndexDescFields := IndexDescFields + SortMarkedColumns[i].FieldName + ';'; 也是如此,于是修改了源码,实现当对Loopup字段排序时,转换成对其KeyField的排序。 源码如下: for i := 0 to SortMarkedColumns.Count - 1 do begin if SortMarkedColumns[i].Field.FieldKind = fkLookup then IndexFields := IndexFields + SortMarkedColumns[i].Field.KeyFields + ';' else IndexFields := IndexFields + SortMarkedColumns[i].FieldName + ';'; if SortMarkedColumns[i].Title.SortMarker = smUpEh then begin if SortMarkedColumns[i].Field.FieldKind = fkLookup then IndexDescFields := IndexDescFields + SortMarkedColumns[i].Field.KeyFields + ';' else IndexDescFields := IndexDescFields + SortMarkedColumns[ i].FieldName + ';'; end; end; EhlibADO、EhlibBDE中是否也有这样的问题,没有测试。
另外,当点击DBGridEh的Title进行排序时,发现如果ClientDataset没有设置过IndexFieldNames,用Midas源码编译过的Midas.dll,会产生DBERR_NOSUCHINDEX错误,而系统Midas.dll则不会出错。分析源码,发现Midas源码中,hbcore.pas中的TDSCursor.UseIndexOrder函数出错。如果设置过ClientDataset设置过IndexFieldNames,其IndexDefs中会自动添加一个Name=''的IndexDef,否则没有。如果 I := FDSBase.FindIndex(pszName); 中的pszName=''时,I<0,引出DBERR_NOSUCHINDEX错误。 因此,修改源码如下: if (not Assigned(pszName)) or ((StrPas(pszName) = '') and (FDSBase.FindIndex(pszName) < 0)) then begin if FIsDelta then DefIndexName := szDEFAULT_ORDER else DefIndexName := szPRIMARY_KEY;
if FDSBase.FindIndex(DefIndexName) >= 0 then pszName := DefIndexName else pszName := szDEFAULT_ORDER; end; 问题解决。